Django删除评论报错:Generic detail view需传入pk或slug
解决Django删除评论时的AttributeError问题
这个错误的核心是:你的CommentDeleteView作为通用详情视图,必须从URL里拿到要删除的评论的pk(主键)或者slug字段值,才能定位到要删除的对象,但你的URL配置、模板链接或者视图设置里没满足这个要求。下面一步步修正:
1. 修正URL配置
打开项目的urls.py,确保给CommentDeleteView的路由加上pk参数(用slug的话同理):
from django.urls import path from .views import CommentDeleteView urlpatterns = [ # 其他路由... path('comments/<int:pk>/delete/', CommentDeleteView.as_view(), name='comment_delete'), ]
这里<int:pk>是关键,它会把URL里的数字作为主键传递给视图。
2. 配置CommentDeleteView
确保你的视图正确指定了模型,并且重写删除成功后的跳转页面:
from django.views.generic import DeleteView from django.urls import reverse_lazy from .models import Comment class CommentDeleteView(DeleteView): model = Comment # 指定要操作的模型是Comment # 如果你的Comment用slug而不是pk识别,就添加下面两行: # slug_field = 'slug' # 模型里的slug字段名 # slug_url_kwarg = 'slug' # URL里对应的参数名 def get_success_url(self): # 删除后跳转到评论所属的文章页面,这里假设文章详情页的路由名叫'post_detail' return reverse_lazy('post_detail', kwargs={'pk': self.object.post.pk}) # 如果文章用slug识别,就改成 kwargs={'slug': self.object.post.slug}
3. 修正模板里的删除按钮链接
确保模板里的删除表单正确传递了评论的pk:
<!-- 假设你在遍历评论的循环里,每个评论对象是comment --> <form method="post" action="{% url 'comment_delete' comment.pk %}"> {% csrf_token %} <button type="submit" onclick="return confirm('确定删除这条评论吗?')">删除</button> </form>
这里{% url 'comment_delete' comment.pk %}会生成带评论主键的URL,视图就能拿到对应的评论对象了。
常见错误排查
- 有没有忘记在URL里加
<int:pk>或者<slug:slug>?这是最常见的原因。 - 模板里的
url标签有没有传对参数?比如是不是漏传了comment.pk,或者参数名和URL里的不匹配? - 视图里有没有指定
model?如果没指定,视图不知道要操作哪个模型,也会触发类似错误。
内容的提问来源于stack exchange,提问作者Ldnsky
相关产品推荐
相关产品推荐

