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

Django评论编辑异常:无论编辑哪条,总是修改最后添加的评论

Django评论编辑错误:总是修改最后一条评论的解决方案

问题根源

  1. 路由未传递评论的主键ID:当前路由仅传入了博客的pk,而UpdateView默认通过URL中的pk参数获取要修改的对象,导致视图无法定位到目标评论,反而返回查询集中的最后一条评论(或与博客ID匹配的评论)。
  2. form_valid方法冗余且错误:强制重新设置form.instance.blog和form.instance.author,会覆盖评论原本关联的属性,进一步加剧错误。

修复步骤

1. 修改路由,添加评论主键参数

更新路由,加入评论的comment_pk参数,让视图能获取到要编辑的评论ID:

path('blog/<int:pk>/comment/<int:comment_pk>/update', views.CommentUpdateView.as_view(), name='update_comment')

2. 调整视图,正确获取评论对象

修改CommentUpdateView,指定用comment_pk定位评论,并移除冗余的form_valid代码:

class CommentUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = BlogComment
    form_class = CommentUpdateForm
    template_name = 'talesoflnk/blog_comment_update_form.html'
    # 指定从URL的comment_pk参数获取评论主键
    pk_url_kwarg = 'comment_pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['blog'] = get_object_or_404(Blog, pk=self.kwargs['pk'])
        return context
    
    def get_success_url(self):
        return reverse('blog-detail', kwargs={'pk': self.kwargs['pk']})
    
    def test_func(self):
        comment = self.get_object()
        return self.request.user == comment.author
  • pk_url_kwarg = 'comment_pk':告诉UpdateView使用URL中的comment_pk参数定位评论,确保get_object()能拿到正确的目标评论。
  • 移除原form_valid方法:评论已存在时,其author和blog属性无需重新设置,强制赋值会覆盖原有正确关联。

3. 更新评论编辑链接(博客详情页中)

确保生成编辑链接时,同时传递博客ID和评论ID:

<a href="{% url 'update_comment' pk=blog.pk comment_pk=comment.pk %}">编辑评论</a>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:55:13