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

Django 2.0中如何筛选指定博客所属的关联文章?

解决Django中筛选指定博客下文章的问题

嘿,我看你遇到的问题是模板里遍历文章的逻辑搞反啦,咱们一步步来搞定它:

首先搞清楚模型的关联关系

你的Articles模型里通过blog = models.ForeignKey(Blogs,...)建立了和Blogs的关联,这意味着:

  • 每个Articles对象都有一个blog属性,指向它所属的博客
  • 每个Blogs对象的反向查询默认是模型名小写_set,也就是articles_set,用来获取该博客下的所有文章

你模板里写的{% for a in article.blog_set.all %}有两个问题:

  1. 上下文里的变量是blog(从{{ blog.title }}能看出来),不是article
  2. 反向查询的方向搞反了,应该是从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:15