【问题标题】:Django model forms - disabled fields in changed_dataDjango 模型表单 - changed_data 中的禁用字段
【发布时间】:2016-08-16 14:49:44
【问题描述】:

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

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

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() 为真(因此实例被无缘无故地保存),即使我保存表单而不更改实例也是如此。我发现 django 在 changed_data 中包含禁用字段 - 这是没有意义的,因为无论如何用户都不应该更改禁用字段。

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

【问题讨论】:

  • 我也有这个问题。您找到解决方案了吗?
  • 不完全是,我手动解决了。即从 changed_data 中删除禁用字段

标签: django django-forms


【解决方案1】:

这是 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 拥有唯一更新但未删除的表单。

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 2020-11-30
    • 2020-03-30
    • 1970-01-01
    • 2012-03-02
    • 2013-08-27
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多