Django评论编辑异常:无论编辑哪条,总是修改最后添加的评论
Django评论编辑错误:总是修改最后一条评论的解决方案
问题根源
- 路由未传递评论的主键ID:当前路由仅传入了博客的
pk,而UpdateView默认通过URL中的pk参数获取要修改的对象,导致视图无法定位到目标评论,反而返回查询集中的最后一条评论(或与博客ID匹配的评论)。 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
相关产品推荐
相关产品推荐

