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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:03:26