首页 > 解决方案 > Django在页面上显示多个类别

问题描述

我有这个 model.py 文件:

class Category(models.Model):
    title = models.CharField(max_length=255, verbose_name="Title")

    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        return self.title

class Video(models.Model):
    title = models.CharField(max_length=128)
    description = models.TextField(default='')
    thumbnail = models.ImageField(default='default_thumbnail.png', upload_to='thumbnails')
    date_posted = models.DateTimeField(default=timezone.now)
    category = models.ForeignKey(
        Category,
        on_delete=models.SET_DEFAULT,
        #null=True,
        default=1,
        verbose_name="Category"
        )

    def __str__(self):
        return self.title

每个视频都有自己的类别,我想在一个页面上显示每个类别中给定数量的电影。

目前,我只显示页面上的最后 5 个视频:

def home(request):
    latest_videos = Video.objects.all().order_by('-date_posted')[:5]

    categories = Category.objects.all()

    context = {
        'latest_videos': latest_videos,
        #'categories': categories,
    }
    return render(request, 'videos/home.html', context)

我不知道如何在每个类别中显示给定数量的电影。我试图发送所有视频并在模板上查询它们,但这可能是不可能的。

有任何想法吗?我还在学习Django,但是这次我发现了一个我一整天都解决不了的问题。谢谢

标签: djangodjango-models

解决方案


我不知道您需要在模板中显示多少个类别,但一种方法是:

def home(request):
    ready_data = []
    all_categories = Category.objects.prefetch_related('video_set').all() # Note that video_set is your default related query name
    for _c in all_categories:
        related_videos = _c.video_set.all().order_by('-date_posted')[:5]
        ready_data.append({"category_id": _c.id, "category_title": _c.title, "related_videos": related_videos})

    context = {
        'data': ready_data 
    }
    return render(request, 'videos/home.html', context)

您还应该将模板的这一部分更改为:

{% for d in data %}
<p> category: {{ d.category_id }}, {{ d.category_title }} </p>
{% for v in d.related_videos %}
<h3> Videos </h3>
<p> {{ v.id }}- {{v.title}} </p>
{% endfor %}
{% endfor %}

这样,您可以显示每个类别和最后 5 个相关视频。


推荐阅读