gpt4 book ai didi

Django 模型表单 - changed_data 中的禁用字段

转载 作者:行者123 更新时间:2023-12-04 03:19:58 26 4
gpt4 key购买 nike

我有一个表单基类,它检查表单正在更新的实例是否已更改,如果没有更改则不保存。

这是在我的自定义模型表单中,我覆盖保存:

class MyModelForm(models.ModelForm):
# .. more code here..
def save(self, commit=True):
if self.has_changed():
# Won't do anything if the instance did not changed
return self.instance
return super(MyModelForm, self).save(commit)

我的很多表单都使用这个基类。现在,我的一个表单有几个字段,我将它们设置为 disabled=True (django 1.9 +)。所以在我的一种形式中:

def __init__(self, *args, **kwargs):
## ..code
self.fields['address'].disabled = True

经过大量调试,为什么 form.has_changed() 为 True(因此无缘无故地保存了实例),即使我在不​​更改实例的情况下保存表单。我发现 django 在 changed_data 中包含禁用字段 - 这没有任何意义,因为无论如何用户都不应该更改禁用字段。

我是不是遗漏了什么,或者这是一个错误,或者它应该如何工作?我如何在不进行太多更改的情况下解决此问题,因为我的代码中经常使用表单基类。

最佳答案

这是 DjangoProject 的一个已知问题,票证位于 https://code.djangoproject.com/ticket/27431。和相应的 PR 在 https://github.com/django/django/pull/7502 .在编写此答案时,PR 已与 master 合并,因此最新版本应该已修复此问题。

解决方法如下

for form in formset:
if form.has_changed() and form not in formset.deleted_forms:
fields = form.changed_data
up_f = [field for field in fields if not form.fields[field].disabled]
if len(up_f) > 0:
updated_data.append(form.cleaned_data)

这导致 updated_data 具有唯一更新但未删除的表单。

关于Django 模型表单 - changed_data 中的禁用字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com