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

Django继承DeleteView的CBV不显示确认删除页直接删对象如何解决

问题原因
  • 未触发GET请求加载确认页:Django 内置 DeleteView 的默认逻辑是,仅GET请求会渲染删除确认模板,POST请求会直接执行对象删除操作。如果你的前页(比如列表页)的删除按钮直接以POST方式提交到删除路由,就会跳过确认步骤直接删除对象。
  • 确认页表单缺失路由参数:你当前确认页的表单action属性未传入必填的identifier参数,会导致表单提交时报404或者路由匹配错误。
  • 视图代码存在语法错误(疑似手误):test_func 方法中将查询到的对象赋值给了photo变量,但后续判断用的是未定义的foo变量,会触发运行时错误。
  • 模板存放路径错误:你给出的模板路径嵌套了两层templates目录,不符合Django默认的模板查找规则,会导致视图找不到确认模板,触发报错。
修复方案
  1. 调整前页删除入口的请求方式
    把前页的删除按钮从POST提交改为普通GET跳转链接,示例:
<!-- 列表页中每个Foo条目对应的删除链接 -->
<a href="{% url 'myapp:foo-delete' identifier=foo.identifier %}">删除</a>

点击该链接会以GET请求访问删除视图,触发确认页渲染。

  1. 修正确认页表单的action参数
    把foo_confirm_delete.html里的表单代码改成:
<form action="{% url 'myapp:foo-delete' identifier=object.identifier %}" method="post">{% csrf_token %}

确保提交时能正确传入对象的identifier参数。

  1. 修正视图的语法错误
    把test_func方法的变量对齐:
def test_func(self):
    foo = self.get_object()
    return self.request.user == foo.owner

另外你重写的get_object方法和DeleteView的默认逻辑完全一致,可以直接删除,简化代码。

  1. 调整模板存放路径
    把foo_confirm_delete.html移动到 /path/to/foo/templates/foo/ 目录下,删除多余的一层templates嵌套,确保视图能正常加载确认模板。

内容的提问来源于stack exchange,提问作者Homunculus Reticulli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:57:01