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

Django DetailView下获取ManyToMany关联标签查询相关文章的实现问题

解决方案

完全不需要重写get_object方法,你可以直接在get_context_data中获取到当前文章的对应值。

错误原因

你之前代码里写的post_tags = Post.tags.all()是直接调用Post模型类的字段属性,拿到的是全站所有文章的全部标签,不是当前正在访问的单篇文章的标签。
DetailView在执行get_context_data逻辑前,已经完成了单篇Post的查询操作,查询到的当前文章实例会默认存放在self.object属性中,你直接调用这个实例的tags属性就能拿到当前文章的关联标签。

修正后代码

class GetPost(DetailView):
    model = Post
    template_name = 'blog/post.html'
    context_object_name = 'post'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 获取当前文章的所有关联标签
        post_tags = self.object.tags.all()
        # 筛选带相同标签的文章,排除当前文章本身,去重后取前3条
        context['related'] = Post.objects.filter(tags__in=post_tags).exclude(id=self.object.id).distinct()[:3]
        return context

补充说明

新增的distinct()是为了避免一篇文章有多个标签和当前文章匹配时,返回重复的相关文章结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:57:04