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

如何向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,提问作者Кирилл Черняк

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:11