Django modelformset_factory 删除标记为删除的模型表单

2024-01-02

使用 modelformset_factory 时,如何从数据库中删除表单中标记为删除的对象?

我像这样创建 modelformset_factory :

ItemFormset = modelformset_factory(Item, ItemModelForm, extra=1, can_delete=True)
qset = Item.objects.filter(pr=pr)
formset = ItemFormset(queryset=qset)

当表单集在 POST 中返回时,我得到如下数据:

if request.method == "POST":
    formset = ItemFormset(request.POST,queryset=qset)
    if  formset.is_valid():
        marked_for_delete = formset.deleted_forms
        instances = formset.save(commit=False)
        for item in instances:
            item.pr = pr
            item.save()

当表单集返回时,我可以获得标记为删除的所有对象formset.deleted_forms但我不知道如何真正删除它们。我尝试循环遍历每一项并单独删除每一项,但出现错误:Item object can't be deleted because its id attribute is set to None.

在我包含的模板中{{form.id}}所以每个对象都有它的 ID 在 POST 中传回。

打电话后instances = formset.save(commit=False)我可以打电话formset.deleted_objects但这只是一个空列表:[]

谁能看到我做错了什么,导致对象不会从数据库中删除?


让你感到困惑的是formset.save(commit=False)并没有按照你的想法去做。

虽然与commit=False设置、编辑的对象不是save()d、令人困惑的是,已删除的对象被删除。

因此,当你循环时marked_for_delete打电话后save(commit=False),你得到的对象已经被删除了,因此None为他们的ID。

你的自我回答是更好、更惯用的 Django,因为它恰好是这样;一般来说,应该打电话formset.save()并让它默认为commit=True。事实是commit=False这种情况相对罕见并且被废弃可能就是为什么没有人修复删除对象的(IMO,有缺陷的)行为。

(顺便说一句,我只在非事务/自动提交数据库环境中观察到这种行为;可能是commit=False并且事务使您能够在删除方面获得更稳健的行为。)

附: - 这种行为已经Django 1.7 中发生了变化:

“如果您调用 formset.save(commit=False),对象将不会自动删除。您需要对每个 formset.deleted_objects 调用 delete() 才能实际删除它们。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django modelformset_factory 删除标记为删除的模型表单 的相关文章

随机推荐

  • MS SQL:通过包含新表中的附加列来更改索引视图

    我需要通过包含新创建的表中的附加列值来更新现有的 MS SQL 索引视图 索引视图 CREATE OR ALTER VIEW dbo MySelectionInfo WITH schemabinding AS SELECT C Id id0
  • 在精灵上制作滚动视图锁定并放大它

    参考我之前的问题 Swift 2 0 SpriteKit 滚动视图不使用页面 https stackoverflow com questions 34849615 swift 2 0 spritekit scrollview to not
  • 如何使用 spring-boot gradle 插件进行混淆

    如何使用 Spring Boot 2 和 gradle 构建设置 proguard 混淆 你好 尝试使用其 gradle 插件和 Proguard gradle 插件设置 Spring Boot 应用程序的代码混淆 Google 主要为旧的
  • 安装工具平台特定依赖项

    有什么方法可以告诉 setuptools 或分发以在特定平台上需要包吗 在我的具体情况下 我使用readline 它是 Unix 系统上标准库的一部分 但在 Windows 上我需要pyreadline模块来替换该功能 参见这个问题 htt
  • 如何将wordpress中的下载网址路径更改为www.yoursite.com/download?

    我试图隐藏或缩短上传到 wp content uploads 文件夹的文件或图片的链接 默认情况下 在 WordPress 中 如果您上传图像 pdf 等并将其插入帖子或页面 它将具有如下链接 mysite com wp content u
  • 如何在代码隐藏中使用 Eval 来设置 Page.Title

    我有一个绑定到 ListView 控件的 SQLDataSource 但我想将部分绑定记录放入 HTML TITLE 属性中 这是我想要更改的代码隐藏文件 以便它可以使用 Eval 根据数据内容构建动态 TITLE Public Parti
  • 汇编 x86 中的 Math.h 库函数? [复制]

    这个问题在这里已经有答案了 我尝试将 Linux fedora 9 下编写的 C 代码转换为汇编 x86 代码 但是 我在 Math h 函数中遇到问题 该库中的函数 例如 ceil floor log log10 pow 在 x86 汇编
  • Java 中 volatile 关键字最简单易懂的示例

    我正在读关于volatileJava 中的关键字并完全理解其中的理论部分 但是 我正在寻找的是一个很好的案例 它展示了如果变量不存在会发生什么volatile如果是的话 下面的代码片段无法按预期工作 摘自here https stackov
  • 回发后视图状态不保留

    我在保持控件回发时的视图状态时遇到一些问题 vb net 这是我在控制中放入的一些代码 Protected Overrides Sub OnInit ByVal e As System EventArgs MyBase OnInit e M
  • 如何避免在 TEdit 聚焦时按下 Escape 时发出叮当声?

    在我几年前开发的代码中 我经常使用它来随时按 Escape 键关闭当前表单 procedure TSomeForm FormKeyPress Sender TObject var Key Char begin if key 27 then
  • Shibboleth - 如何读取属性?

    我已使用 Shibboleth 成功登录到我的服务提供商测试页面 然后我转到 Shibboleth sso Session 页面 我看到以下内容 Attributes affiliation 1 value s entitlement 1
  • 我可以制作图案密码屏幕锁定 android 应用程序吗

    有人有开发应用程序来替换默认锁定屏幕的经验吗 我被告知这是不可能的 但是this http www 1mobile com pattern password screen locker 849722 html应用程序管理它 您知道的任何教程
  • 新手批量问题-创建文件

    我正在开发一个批处理程序 该程序可以扫描 PC 的各个部分 并将它们记录到文件中 令人惊讶的是 我无法让程序创建要写入的文件 然后我尝试创建一个文件 我相当确定它会起作用 如下 echo off ipconfig gt ip txt tim
  • Android:视图类和活动类的 startActivityForResult 和 setResult

    我很困惑 不知道如何使用 startActivityResults 和 setResults 从以前的活动中获取数据 我有一个视图类和一个活动类 基本上在我的视图类中 我有这个对话框 它实际上会启动称为 colorActivity 类的活动
  • 如何使 Spark 驱动程序能够适应 Master 重启?

    我有一个 Spark Standalone 不是 YARN Mesos 集群和一个正在运行的驱动程序应用程序 在客户端模式下 它与该集群通信以执行其任务 但是 如果我关闭并重新启动 Spark 主节点和工作节点 驱动程序不会重新连接到主节点
  • 写入文本文件

    我正在寻找一种用 C 写入文本文件的方法 我创建了一个表单 其中包含名字 姓氏 电话号码 出生日期的文本框 当用户点击按钮时 我希望将该信息写入文本文件 我发现的例子并没有真正告诉我如何做到 所以这就是我在这里问的原因 最简单的方法就是使用
  • Spark中Map任务内存消耗巨大

    我有很多文件 大约包含 60 000 000 行 我的所有文件都采用以下格式 timestamp producer messageId data bytes n 我一一浏览我的文件 并且还想为每个输入文件构建一个输出文件 因为有些台词依赖于
  • robocopy 无效参数“-”

    我正在尝试完成我的批处理脚本 但在某些情况下它会失败 这是我正在运行的命令 ROBOCOPY C test dash2 Hello 4 C test dash2 Hello 4 MOV 这是我收到的错误 ROBOCOPY Robust Fi
  • 将图例名称设置为匿名 geom_function

    有没有办法为匿名 geom function 设置图例名称 我设法为不同种类的鸢尾花找到一个图例 但也想为我的产品线提供一个标签 非常感谢 data iris iris gt ggplot aes x Sepal Length y Sepa
  • Django modelformset_factory 删除标记为删除的模型表单

    使用 modelformset factory 时 如何从数据库中删除表单中标记为删除的对象 我像这样创建 modelformset factory ItemFormset modelformset factory Item ItemMod