Django使用MPTTModel做评论层级,发布前审核功能失效如何解决?
你的问题主要出在两个地方:
- 模板直接调用了反向关联的全量评论集合
blog.blogcomment_set.all,没有做审核状态过滤,导致所有评论都直接展示 - 你之前自定义的评论查询集没有传入模板上下文,
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
相关产品推荐
相关产品推荐

