0

0

Django UpdateView 中正确实现删除功能的完整教程

碧海醫心

碧海醫心

发布时间:2026-03-07 17:46:01

|

425人浏览过

|

来源于php中文网

原创

Django UpdateView 中正确实现删除功能的完整教程

在 Django 的 UpdateView 中添加删除功能时,若直接提交表单到错误 URL 或未正确调用 delete(),会导致对象被意外复制而非删除;本文详解如何安全、规范地集成删除逻辑。

在 django 的 updateview 中添加删除功能时,若直接提交表单到错误 url 或未正确调用 `delete()`,会导致对象被意外复制而非删除;本文详解如何安全、规范地集成删除逻辑。

在基于类的视图(CBV)中复用 UpdateView 同时支持编辑与删除,是常见但易出错的需求。你遇到的“点击删除反而新增一条记录”问题,根本原因在于:表单提交未指向当前对象的更新端点,且删除逻辑未正确操作数据库对象,反而触发了默认的 form.save() 流程(例如因 action="" 缺失或 success_url 路由误导向创建逻辑)。

✅ 正确做法:保持路由一致 + 显式删除对象

首先,确保 HTML 表单 action 属性为空或省略——这会使表单始终提交到当前 URL(即 /entries/123/),从而命中同一个 SingleEntryView 实例:

<!-- single_entry.html -->
<form method="POST">
    {% csrf_token %}
    {% for field in form %}
        {{ field.label_tag }}
        {{ field }}
        {% if field.errors %}
            <small class="error">{{ field.errors|striptags }}</small>
        {% endif %}
    {% endfor %}
    <button type="submit" name="update_button">Save Changes</button>
    <button type="submit" name="delete_button">Delete Entry</button>
</form>

⚠️ 注意:action="/" 是致命错误!它会将 POST 提交到首页(可能对应 EntryView),而该视图很可能是一个 CreateView 或列表页,导致新建对象。

其次,在视图中重写 post() 方法,精准识别删除请求,并跳过表单验证与保存流程,直接删除对象:

Texta
Texta

AI博客和文章一键生成

下载
# views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib import messages
from django.views.generic.edit import UpdateView
from .models import Entry

class SingleEntryView(UpdateView):
    template_name = 'single_entry.html'
    model = Entry
    fields = ['ticker', 'strategy', 'result', 'comments', 'image']
    success_url = '/'  # 删除后跳转目标(可改为 reverse('entry-list'))

    def post(self, request, *args, **kwargs):
        # 先显式获取对象(避免 self.object 为 None)
        self.object = self.get_object()
        if 'delete_button' in request.POST:
            self.object.delete()
            messages.success(request, "The trading entry has been deleted.")
            return HttpResponseRedirect(self.get_success_url())
        # 非删除请求:走父类标准流程(验证 → 保存)
        return super().post(request, *args, **kwargs)

    def form_valid(self, form):
        # 确保编辑时关联当前用户(如模型含 user 字段)
        form.instance.user = self.request.user
        return super().form_valid(form)

? 关键原理说明

  • self.get_object() 是 UpdateView 的核心方法,根据 URL 中的 pk 查询实例。必须在 delete 分支中显式调用并赋值给 self.object,否则后续 delete() 可能失败。
  • 绝不调用 super().post(...) 进入表单处理流程:UpdateView.post() 默认会执行 form.is_valid() → form.save(),若此时 self.object 已被删或未初始化,极易引发异常或静默创建新对象。
  • 使用 HttpResponseRedirect(或 redirect())显式跳转,避免重复提交风险;配合 messages 提供用户反馈。

? 常见错误规避清单

  • ❌ 错误:
    → 提交到根路径,脱离当前对象上下文
  • ❌ 错误:在 delete 分支中调用 super().post(...) 或 form.save()
  • ❌ 错误:未在 delete 分支中调用 self.get_object(),导致 self.object 为 None
  • ❌ 错误:success_url 指向创建视图(如 EntryCreateView),造成“假删除真新建”
  • ✅ 推荐:为删除按钮添加 formmethod="post" 和独立 name,便于后端精准识别(已实现)

? 进阶建议(可选)

若需更健壮的 UX,可添加二次确认:

<button type="button" onclick="if(confirm('Delete this entry?')) document.getElementById('delete-form').submit()">
    Delete Entry
</button>
<form id="delete-form" method="post" style="display:none;">
    {% csrf_token %}
    <input type="hidden" name="delete_button" value="1">
</form>

最后,请验证 Entry 模型是否正确定义了 user 字段(当前 form_valid 中设置了 form.instance.user,但模型代码未体现该字段)。若模型无 user = models.ForeignKey(...),请补充,否则编辑保存会报错。

遵循以上结构,你的 UpdateView 将同时具备安全编辑与原子删除能力,彻底解决“越删越多”的问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

159

2026.02.04

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

383

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2108

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号