Django评论删除功能报错:Reverse for 'delete_reply'未找到
Django评论删除功能报错解决
问题诊断
报错Reverse for 'delete_reply' with arguments '(7, '')' not found说明生成删除URL时,第二个参数reply_pk是空字符串。核心原因有两点:
- 详情页视图未传递当前帖子的回复列表到模板,或模板未正确遍历回复实例
- 删除视图的权限判断存在逻辑错误
修复步骤
1. 完善详情页视图,传递回复数据
修改Board_detail类的get方法,将当前帖子的所有回复查询并传递给模板:
class Board_detail(View): def get(self, *args, **kwargs): pk = kwargs.get("pk") try: form = forms.ReplyForm() board = board_models.Board.objects.get(pk=pk) replies = board.reply.all() # 通过related_name获取关联回复 return render(self.request, "boards/board_detail.html", { "board": board, "form": form, "replies": replies # 添加回复列表到上下文 }) except board_models.Board.DoesNotExist: raise Http404()
2. 修正模板遍历逻辑
在模板中确保遍历回复列表,针对每个回复实例生成删除链接:
{% for reply in replies %} <div class="reply-item"> <p>{{ reply.reply }}</p> <!-- 仅在遍历单个回复实例时,reply.pk才会有有效值 --> <a href="{% url 'boards:delete_reply' board.pk reply.pk %}" class="btn-link">Delete</a> </div> {% endfor %}
3. 修复删除视图的权限判断错误
delete_reply视图中,用户实例与用户ID直接比较会导致逻辑错误,修正为:
@login_required() def delete_reply(request, board_pk, reply_pk): try: reply = board_models.ReplyBoard.objects.get(pk=reply_pk) # 直接比较用户实例而非ID if request.user != reply.user: messages.error(request, "无权删除该评论") else: reply.delete() messages.success(request, "评论已删除") except board_models.ReplyBoard.DoesNotExist: messages.error(request, "目标评论不存在") return redirect(reverse("boards:board_detail", kwargs={"pk": board_pk}))
4. 验证URL配置
确认项目根urls.py中已正确设置boards应用的命名空间:
# 根urls.py from django.urls import path, include urlpatterns = [ # ...其他路径 path('boards/', include('boards.urls', namespace='boards')), ]
内容的提问来源于stack exchange,提问作者Woohyun Lee
相关产品推荐
相关产品推荐

