Django群组页面点赞第二用户帖子触发DoesNotExist错误如何解决
问题根因
你的代码存在主键混淆逻辑错误:点赞、评论视图传入的pk是帖子(Post)的主键,你直接复用同一个pk去查询群组(GroupEx),只有当Post的主键与GroupEx主键恰好相同时才会正常运行,这就是第一个用户发的帖子正常、后续帖子报错的核心原因。
具体错误点
- 点赞视图错误逻辑:
# 此处传入的pk是Post的主键 post = Post.objects.get(pk=pk) # 错误:直接用Post的主键查询GroupEx group = GroupEx.objects.get(group=pk)
- 评论视图错误逻辑:
post = get_object_or_404(Post, pk=pk) # 错误:直接用Post的主键查询GroupEx group = get_object_or_404(GroupEx,pk=pk)
- 额外冗余逻辑:点赞视图中
return redirect写在了return HttpResponse前面,后者永远不会被执行,属于无效代码。
修正方案
Post模型已经绑定了GroupEx外键,直接从Post对象中读取关联的GroupEx即可,不需要额外查询,同时修正跳转参数错误:
修正后点赞视图
def like(request, pk): user = request.user post = get_object_or_404(Post, pk=pk) # 直接从post的关联字段取群组,不需要额外查询 group = post.group liked= False like = Like.objects.filter(username=user, post=post,group=group) if like.exists(): like.delete() else: liked = True Like.objects.create(username=user, post=post, group=group) # 按需保留一种返回逻辑,二选一即可 # 方案1:返回json响应 # resp = {'liked':liked} # return HttpResponse(json.dumps(resp),content_type = "application/json") # 方案2:跳转到群组主页,需要传群组主键而非帖子主键 return redirect('group:main', pk=group.pk)
修正后评论视图
def comment(request, pk): context = {} user = request.user post = get_object_or_404(Post, pk=pk) # 直接从post的关联字段取群组,不需要额外查询 group = post.group if request.method == 'POST': form = NewCommentForm(request.POST) if form.is_valid(): data = form.save(commit=False) data.post = post data.group = group data.username = user data.save() # 跳转到群组主页,传群组主键而非帖子主键 return redirect('group:main', pk=group.pk) else: form = NewCommentForm() context['form'] = form return render(request,'group/grouptimeline.html',context)
内容的提问来源于stack exchange,提问作者Godda
相关产品推荐
相关产品推荐

