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

Django使用MPTTModel做评论层级,发布前审核功能失效如何解决?

你的问题主要出在两个地方:

  1. 模板直接调用了反向关联的全量评论集合blog.blogcomment_set.all,没有做审核状态过滤,导致所有评论都直接展示
  2. 你之前自定义的评论查询集没有传入模板上下文,DetailView默认的queryset是针对主模型Blog的,不会作用于评论查询

修改方案

1. 调整视图代码,把已审核的评论传入上下文

修改views.py里的BlogDetail类,在上下文里追加已审核的评论查询结果:

class BlogDetail(DetailView):
    model = Blog
    template_name = 'blog_details.html'      
    
    def get(self,request,slug):
        blog = Blog.objects.get(slug=slug)
        form = CommentFrom()
        # 追加已审核评论查询,按MPTT树结构排序保证层级正确
        approved_comments = blog.blogcomment_set.filter(is_approve=True).order_by('tree_id', 'level', 'lft')
        context = {'form':form,
                   'blog':blog,
                   'approved_comments': approved_comments # 传入模板上下文
                 }
        return render(request,'blog_details.html',context)

    def post(self,request,slug):
        blog = Blog.objects.get(slug=slug)
        form = CommentFrom(request.POST)
            
        if form.is_valid():
           comment = form.save(commit=False) 
           comment.blog = blog
           comment.save()
           messages.add_message(self.request, messages.INFO, 'Your Comment pending for admin approval')
           return redirect(reverse('blog-detail', kwargs={'slug':slug}))
        
        # 原代码里的form()是无效调用可直接删除
        approved_comments = blog.blogcomment_set.filter(is_approve=True).order_by('tree_id', 'level', 'lft')
        context = {'form':form,
                   'blog':blog,
                   'approved_comments': approved_comments
                 }
        return render(request,'blog_details.html',context)

2. 调整模板代码,使用筛选后的评论集合渲染

把模板里的递归标签参数换成你传入的已审核评论集合即可:

{% load mptt_tags %}
                        
{% recursetree approved_comments %}
<p>comment: {{node.comment}}</p>
            {% if not node.is_leaf_node %}
               <div class="children pl-2 pl-md-5">
                {{ children }}
                </div>
            {% endif %}
{% endrecursetree %}

验证方法

修改完成后,先进入Django后台管理界面,找到对应评论,勾选is_approve字段并保存,刷新前端页面即可看到审核通过的评论。

额外小提示:你forms.py里的表单类名写的是CommentFrom,大概率是CommentForm的笔误,不影响当前功能但建议修正避免后续开发出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 22:36:00