You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中实现分类及下属文章列表的正确展示方法

解决分类列表及对应文章的正确展示问题

我明白你现在的困扰——当前代码是遍历每一篇文章,导致同一个分类会跟着每篇文章重复出现,没法把同一分类下的文章归到一起展示对吧?咱们一步步来调整:

第一步:优化模型的related_name(可选但推荐)

你当前Post模型里的related_name='category'语义有点颠倒,改成更直观的名字比如posts,这样从Category对象就能直接拿到它下属的所有文章,逻辑更清晰:

class Post(models.Model):
    title = models.CharField(max_length=100)
    # 把related_name改为posts,语义更贴合关联关系
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts', null=False)

第二步:修改视图,获取分类列表并预取关联文章

原来的视图是查询所有Post,现在要切换成查询所有Category,同时用prefetch_related预加载每个分类下的文章,避免低效的N+1查询:

class CategoryList(ListView):
    template_name = 'category_list.html'
    # 现在查询集目标是Category,不再是Post
    def get_queryset(self):
        return Category.objects.all().prefetch_related('posts')

第三步:调整模板结构,先遍历分类再遍历对应文章

模板要先循环每个分类,再在分类的层级下循环它的所有文章,这样就能实现分类分组展示:

<ul>
{% for category in object_list %}
    <li> {{ category.name }}
        <ul>
        {% for post in category.posts.all %}
            <li> {{ post.title }} </li>
        {% empty %}
            <li>暂无文章</li>
        {% endfor %}
        </ul>
    </li>
{% endfor %}
</ul>

这样调整后,每个分类只会显示一次,下面会列出该分类下的所有文章,完全符合你的需求啦。

内容的提问来源于stack exchange,提问作者the_end

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:37:36