Django模板仅显示最后一个文件,而不是全部上传

时间:2018-01-20 08:23:18

标签: python django

我希望每次讲座都能让用户上传多个文件,所以我创建了一个包含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,也不起作用。我需要建议。但是在管理员面板中,如果我想添加一个新的讲座,其他讲座的先前文件也会显示,我不知道如何修复。

3 个答案:

答案 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 类。