Django删除评论时出现Post matching query does not exist错误求助
Django删除评论触发“Post matching query does not exist”问题排查与解决
核心问题分析
错误出在Post.objects.get(pk=pk)这行,说明执行查询时传入的pk值找不到对应的Post记录。大概率是删除评论后跳转/查询环节的参数传递有误,以下是常见原因和解决办法:
1. 删除评论后重定向参数错误
删除评论后需要跳回原帖子详情页,但如果重定向时把评论的ID当成帖子ID传递,就会导致用评论ID查询Post,自然找不到匹配记录。
错误示例(删除视图):
class CommentDeleteView(LoginRequiredMixin, DeleteView): model = Comment def get_success_url(self): # 错把评论pk当作帖子pk传入 return reverse('post-detail', kwargs={'pk': self.object.pk})
正确写法:从评论关联的Post对象获取ID:
class CommentDeleteView(LoginRequiredMixin, DeleteView): model = Comment def get_success_url(self): # 调用评论关联的post的主键 return reverse('post-detail', kwargs={'pk': self.object.post.pk})
2. 帖子详情视图的参数键名不匹配
如果你的urls.py中,帖子详情的URL参数不是pk(比如定义为post_pk),但视图里仍用pk去获取参数,就会拿到错误的值。
比如urls.py错误写法:
path('posts/<int:post_pk>/', PostDetailView.as_view(), name='post-detail')
对应的视图错误写法:
class PostDetailView(DetailView): def get_object(self): pk = self.kwargs.get('pk') # 此处应使用'post_pk' return Post.objects.get(pk=pk)
修正方案:要么把urls里的参数名改为pk,要么视图里使用对应的键名:
class PostDetailView(DetailView): def get_object(self): post_pk = self.kwargs.get('post_pk') return Post.objects.get(pk=post_pk)
3. 模板中删除评论的URL参数错误
模板里生成删除评论的链接时,如果传错参数(比如传帖子ID而非评论ID),会导致后续流程参数混乱。
错误模板代码:
<a href="{% url 'comment-delete' pk=post.pk %}">删除评论</a>
正确写法:传递评论自身的ID:
<a href="{% url 'comment-delete' pk=comment.pk %}">删除评论</a>
4. 改用get_object_or_404优化异常处理
即使参数都正确,也可能存在帖子已被删除的情况,建议把Post.objects.get(pk=pk)替换成get_object_or_404,这样会返回友好的404页面,而非直接抛出异常:
from django.shortcuts import get_object_or_404 class PostDetailView(DetailView): def get_object(self): pk = self.kwargs.get('pk') return get_object_or_404(Post, pk=pk)
内容的提问来源于stack exchange,提问作者Lemon Studios
相关产品推荐
相关产品推荐

