我希望每次讲座都能让用户上传多个文件,所以我创建了一个包含FileField的模型。因此,在我的模板中,我希望每个讲座,上传到特定讲座的文件都显示在模板中。问题是只显示上次上传的文件。
<ul>
{% regroup lectures by get_lecture_category_display as category_list %}
<h3>Lectures</h3>
<ul>
{% for category in category_list %}
<strong>
<li>{{ category.grouper }}</li>
</strong>
<ul>
{% for c in category.list %}
.............
<li>{{ c.lecture_title }}</li>
<li>{{ c.content }}</li>
{% if c.files %}
<li><a href='{{ MEDIA_URL }}{{ c.files.files.url }}'>download</a></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
</ul>
</ul>
def courses(request, slug):
query = Course.objects.get(slug=slug)
context = {'courses': Course.objects.filter(slug=slug),
'lectures': query.lectures.order_by('lecture_category'),
}
return render(request, 'courses/courses.html', context)
class Lecture(models.Model):
course = models.ForeignKey('Course', on_delete=models.CASCADE, default='', related_name='lectures')
lecture_category = models.IntegerField(choices=((0, "Classes "),
(1, "Seminars"),
), default=0)
lecture_title = models.CharField(max_length=100)
content = models.TextField()
files = models.ForeignKey('FileUpload', on_delete=models.CASCADE, null=True, blank=True, )
def __str__(self):
return str(self.lecture_category)
class FileUpload(models.Model):
files = models.FileField(upload_to='documents', null=True, blank=True)
def __str__(self):
return str(self.files)
def file_link(self):
if self.files:
return "<a href='%s'>download</a>" % (self.files.url,)
else:
return "No attachment"
file_link.allow_tags = True
file_link.short_description = 'File Download'
如果我更改为ManytoManyField,也不起作用。我需要建议。但是在管理员面板中,如果我想添加一个新的讲座,其他讲座的先前文件也会显示,我不知道如何修复。
答案 0 :(得分:1)
您将super([type[, object-or-type]])
放在错误的位置。应该是相反的:
ForeignKey
现在,一个讲座可以上传许多文件。然后,在您的模板中,您可以迭代文件:
class FileUpload(models.Model):
uploaded_file = models.FileField(upload_to='documents', null=True, blank=True)
lecture = models.ForeignKey('Lecture', related_name='files')
希望它有所帮助!
答案 1 :(得分:0)
ForeignKey创建多对一关系。这意味着现在您可以使用相同的图像进行多次讲座,但同一讲座的图像不多。 要解决此问题,您可以使用多对多关系:
files = models.models.ManyToManyField('FileUpload')
并在模板中:
{% for file in c.files.all %}
<li><a href='{{ MEDIA_URL }}{{ file.url }}'>download</a></li>
{% endif %}
你也可以像Jahongir Rahmonov一样回答多对一关系。这将允许为一个讲座添加许多文件。
答案 2 :(得分:0)
您的外键关系错误。根据您当前的模型,您的讲座表仅参考特定讲座的上次上传文件。
你的代码应该是这样的。
#models.py
class Lecture(models.Model):
course = models.ForeignKey('Course', on_delete=models.CASCADE, default='', related_name='lectures')
lecture_category = models.IntegerField(choices=((0, "Classes "),
(1, "Seminars"),
), default=0)
lecture_title = models.CharField(max_length=100)
content = models.TextField()
def __str__(self):
return str(self.lecture_category)
class FileUpload(models.Model):
file = models.FileField(upload_to='documents', null=True, blank=True)
lecture = models.ForeignKey('Lecture', related_name='files')
def __str__(self):
return str(self.file)
然后在模板中你可以做
{% for file in c.file_set.all %}
<li><a href='{{ MEDIA_URL }}{{ file.url }}'>download</a></li>
{% endif %}
如果您想直接从讲座模型上传文件,您可以使用InlineModelAdmin在 admin.py 中自定义 ModelAdmin 类。