如何向get_success_url传递Post主键?Django评论删除视图问题
Django CommentDeleteView 删除后跳转对应Post详情页的正确实现
核心实现代码
前提假设
假设你的模型结构如下(外键字段名为post):
# models.py from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() # 其他业务字段... class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments") author = models.ForeignKey(User, on_delete=models.CASCADE) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True)
URL配置中,文章详情页的name为post-detail,接受pk参数:
# urls.py from django.urls import path from .views import PostDetailView, CommentDeleteView urlpatterns = [ path("posts/<int:pk>/", PostDetailView.as_view(), name="post-detail"), path("comments/<int:pk>/delete/", CommentDeleteView.as_view(), name="comment-delete"), # 其他URL规则... ]
方法1:通过删除的Comment对象关联Post(推荐)
直接在get_success_url中通过self.object获取关联的Post,反向解析URL:
# views.py from django.views.generic import DeleteView from django.urls import reverse from .models import Comment class CommentDeleteView(DeleteView): model = Comment template_name = "comments/comment_confirm_delete.html" # 自定义确认删除模板 def get_success_url(self): # 从当前删除的Comment对象获取关联的Post target_post = self.object.post # 反向解析文章详情页URL return reverse("post-detail", kwargs={"pk": target_post.pk})
方法2:从URL参数直接获取Post的PK(更稳妥)
如果你的删除URL包含Post的PK(比如posts/<int:post_pk>/comments/<int:pk>/delete/),可以直接从self.kwargs中提取:
# urls.py 调整后的删除URL path("posts/<int:post_pk>/comments/<int:pk>/delete/", CommentDeleteView.as_view(), name="comment-delete"), # views.py 对应的get_success_url def get_success_url(self): post_pk = self.kwargs.get("post_pk") return reverse("post-detail", kwargs={"pk": post_pk})
常见错误排查
- 确保视图类中指定了
model = Comment,否则self.object无法被正确赋值 - 检查Comment模型的外键字段名称是否正确(比如是不是叫
post,而非article之类的自定义名称) - 方法1中不要在
get_success_url里手动调用get_object(),DeleteView会在删除流程中自动赋值self.object - 确认URL反向解析的name和参数与实际配置一致(比如如果用slug而非pk,要对应修改
kwargs中的键)
学习资源
- Django官方文档:类视图(Class-based views)中的DeleteView章节,重点学习
get_success_url的自定义逻辑 - Django官方文档:模型字段中的ForeignKey章节,了解关联对象的访问方式
- Django官方文档:URL调度中的**反向解析(Reverse resolution of URLs)**章节,掌握
reverse函数的使用
内容的提问来源于stack exchange,提问作者Кирилл Черняк
相关产品推荐
相关产品推荐

