在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
相关产品推荐
相关产品推荐

