如何解决Django-如何将最后上传的文件放入模板?
我正在制作一个用户可以上传声音文件的网站。他们可以查看用户上传的声音文件列表并播放。
这很管用。我已经用音频元素制作了对象列表的 for 循环。
但是,此外,我还希望能够将最近添加的声音文件单独放置在模板底部,以便可以单独处理(即我想将其放在音频元素中与列表中的那些分开,也可以在模板中单独访问它以使用 WebAudio API 处理它)。
我知道我需要使用过滤器并且我一直在阅读 Model.objects.latest('field') 应该可以完成这项工作(我假设在 views.py 中)但是我做的事情非常错误,无论我输入什么我的视图和我的模板会产生错误。我正在使用基于类的视图和 Django 3.1.7 版
如果有人可以向我展示我需要放入我的模型、视图和模板中的内容,以便我可以从对象列表中将最后添加的声音文件放入我的模板中。我将不胜感激。
我的模型如下所示:
class SoundFile(models.Model):
sound_file = models.FileField()
created_on = models.DateTimeField(auto_Now_add=True,null=True)
last_modified = models.DateTimeField(auto_Now=True,null=True)
def get_absolute_url(self):
return reverse('download-file')
我的观点如下:
class SoundUploadView(generic.CreateView):
model = SoundFile
fields = ['sound_file']
template_name = 'upload.html'
class SoundDownloadView(generic.ListView):
model = SoundFile
fields = ['sound_file']
template_name = 'download.html'
我的模板如下所示:
上传.html
{% extends "base_generic.html" %}
{% block content %}
<div class="container">
<form action="#" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.media }}
{{ form.as_p }}
<button class="btn btn-primary btn-sm" type="submit">Upload</button>
</form>
</div>
{% endblock %}
下载.html
{% extends "base_generic.html" %}
{% block content %}
<div class="container">
{% for document in object_list %}
<p> {{ document.sound_file.name }} </p>
<p> Created on: {{ document.created_on}} </p>
<p> Last modified: {{ document.last_modified}} </p>
<audio controls id="player"><source src="{{ document.sound_file.url }}"></audio>
{% endfor %}
</div>
<div>
<a class="button" href="../upload"> Upload your version</a>
</div>
{% endblock %}
谢谢!
def get_queryset(self):
return SoundFile.objects.last()
所以整个视图是:
class SoundDownloadView(generic.ListView):
model = SoundFile
fields = ['sound_file']
template_name = 'download.html'
def get_queryset(self):
return SoundFile.objects.last()
我收到以下回溯错误:
Django Version: 3.1.7
Exception Type: TypeError
Exception Value:
'SoundFile' object is not iterable
Exception Location: /Users/cameronharris/.virtualenvs/my_django_environment/lib/python3.9/site-packages/django/template/defaulttags.py,line 167,in render
Python Executable: /Users/cameronharris/.virtualenvs/my_django_environment/bin/python3
Python Version: 3.9.2
Python Path:
['/Users/cameronharris/django_test/Headroom','/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip','/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9','/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload','/Users/cameronharris/.virtualenvs/my_django_environment/lib/python3.9/site-packages']
解决方法
您只将一个 SoundFile
对象传递给模板,然后您试图在 for 循环中迭代该 单个 对象,这就是为什么您得到 {{1 }} 错误。
ListView 用于显示对象列表。在这里,就您而言,您只有一个对象要表示,因此强烈建议使用 Detilview。
但是如果你仍然想使用ListView,那么试试这个
'SoundFile' object is not iterable
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。