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

