Django 2.0中如何筛选指定博客所属的关联文章?
解决Django中筛选指定博客下文章的问题
嘿,我看你遇到的问题是模板里遍历文章的逻辑搞反啦,咱们一步步来搞定它:
首先搞清楚模型的关联关系
你的Articles模型里通过blog = models.ForeignKey(Blogs,...)建立了和Blogs的关联,这意味着:
- 每个
Articles对象都有一个blog属性,指向它所属的博客 - 每个
Blogs对象的反向查询默认是模型名小写_set,也就是articles_set,用来获取该博客下的所有文章
你模板里写的{% for a in article.blog_set.all %}有两个问题:
- 上下文里的变量是
blog(从{{ blog.title }}能看出来),不是article - 反向查询的方向搞反了,应该是从
blog出发找它的文章,而不是从不存在的article出发
方法1:直接修改模板代码
把遍历的代码改成从blog对象的反向查询集合里取文章:
{% include 'base.html' %} {% block blog %} <h2>{{ blog.title }}</h2> <div class="blog-info"> Tworca : {{ blog.user }} </div> {% block article %} <!-- 这里改成blog.articles_set.all --> {% for a in blog.articles_set.all %} <div class="article"> Opublikowano : {{ a.published }} </div> <img src="{{ a.image.url }}" class="article-img"> <div class="article-intro"> <p>{{ a.content }}</p> </div> {% endfor %} {% endblock %} {% endblock %}
方法2:给外键设置related_name(推荐,代码更直观)
修改Articles模型的外键字段,添加related_name参数,让反向查询的名字更语义化:
class Articles(models.Model): title = models.CharField(max_length=150, verbose_name="Tytul") content = models.TextField(verbose_name="Tekst") published = models.DateTimeField(verbose_name="Data publikacji",auto_now=True) image = models.FileField(upload_to="images",verbose_name="Obrazy",default=None) # 添加related_name,以后可以用blog.articles直接访问文章 blog = models.ForeignKey(Blogs,on_delete=models.CASCADE,null=True, related_name="articles")
然后模板里就可以写成更清晰的形式:
{% for a in blog.articles.all %} <!-- 剩下的代码不变 --> {% endfor %}
方法3:在视图中提前过滤文章(最规范,符合MVT分离)
推荐在视图层完成数据筛选,模板只负责渲染,这样逻辑更清晰,也方便后续做排序、分页等操作。
比如写一个函数视图:
from django.shortcuts import get_object_or_404, render from .models import Blogs def blog_detail(request, blog_id): # 获取指定的博客对象,不存在则返回404 blog = get_object_or_404(Blogs, id=blog_id) # 筛选该博客下的所有文章,按发布时间倒序排列 articles = blog.articles.all().order_by('-published') # 如果没设related_name就用blog.articles_set.all() # 把blog和articles一起传到模板 return render(request, 'blog.html', {'blog': blog, 'articles': articles})
然后模板里直接遍历传递过来的articles即可:
{% for a in articles %} <!-- 剩下的代码不变 --> {% endfor %}
这样修改后,就能正确显示指定博客下的所有文章啦!
内容的提问来源于stack exchange,提问作者M.B
相关产品推荐
相关产品推荐

