【问题标题】:Why does BaseModelForm update ALL fields, despite documentation saying it does not? Is this a bug?为什么 BaseModelForm 更新所有字段,尽管文档说它没有?这是一个错误吗?
【发布时间】:2015-07-14 19:27:53
【问题描述】:

我正在开发一个带有遗留数据库的 django 项目,使用 formset 来编辑一组行。该数据库中的某些字段我不希望 django 更新,尽管我的模型中需要它们。换句话说,我希望它们被视为只读字段。 因此,我很高兴阅读有关保存模型表单集的文档,其中指出:

"当表单中缺少字段时(例如,因为它们有 被排除),这些字段将不会由 save() 方法设置。你 可以找到有关此限制的更多信息,这也适用于 常规 ModelForms,在选择要使用的字段中。”

https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#saving-objects-in-the-formset

确实,当调用 forms.model.BaseModelForm.save() 时,它会调用 forms.model.save_instance(),很好地传递所有表单字段。但是然后调用 instance.save() 而不传递 update_fields !所以所有模型字段都包含在更新查询中:-(

作为测试,我修改了 forms.model.save_instance() 以传递字段:

instance.save(update_fields=fields)

瞧——模型只保存按其表单列出的字段。

我希望更多参与 django 项目的人能告诉我这是错误还是文档问题?我应该提交错误报告吗?我是否遗漏了一些东西 - 我应该以其他方式在这些字段上强制执行“只读”吗?

使用django1.8和python3.4

【问题讨论】:

  • 我认为值得在django-developers 邮件列表中提出这个问题。如果您认为文档可以改进,我相信补丁会非常受欢迎。

标签: django django-models django-forms


【解决方案1】:

我不确定您为什么认为这种行为与该文档相矛盾,或者为什么它需要传递字段来更新。实例已有未更改的数据; Django 将更新表单中的其余字段,并保存整个内容。

【讨论】:

  • 当我读到“这些字段不会由 save() 方法设置”时,我解释为只有表单上指定的字段才会在更新查询中列出。也许我这样读它是因为那是我的用例,但我不认为这是一个不合理的解释。顺便说一句,这不是答案,而是评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2015-06-05
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
相关资源
最近更新 更多