在Django 1.4中,Form.has_changed()和Form.changed_data(未记录)是否按预期工作?

Gho*_*r21 18 django django-forms

从源代码中,您可以看到Django 1.4的Form类具有一个看似相当有用的has_changed()方法和changed_data属性,但是没有记录.我的问题是:按预期完成这些工作,即:

  • In Form.clean(),Form.has_changed()返回True任何表单数据是否已更改,否则返回False
  • In Form.clean(),Form.changed_data是值已更改的字段名称列表.

如果是这样,除了使用未记录的功能的常见警告/危险之外,是否有任何具体原因不使用它们(即可能会有变化,不受支持等)?

注1:为了使这些小部件能够使用自定义小部件,这些小部件需要有一个_has_changed()方法,该方法是为内置小部件定义的.

注2:有趣的是,文档确实包括Formset.has_changed()方法的提及,但没有Form.has_changed().

Gho*_*r21 23

在进一步研究Django源代码后,有了弗洛里安答案的有用提示,我可以报告has_changedchanged_data按照我的问题中的描述进行工作,只要表单有一种方法可以获取初始数据来比较新数据.

所以问题是,从POST数据创建的表单如何知道GET表单的初始值是什么?简短的回答是它没有 - 除非你以某种方式告诉它.有两种方法可以告诉它:

  1. 通过initial表单的关键字参数和/或initial字段的关键字参数,与告诉GET形成初始值的方式完全相同.注意:如果您这样做,则由您决定是否为GET和POST表单使用相同的值.这是唯一真正可靠的方法,因为您可以直接控制初始值.

  2. 你让Django通过为每个适用的字段设置show_hidden_initial关键字参数来记住GET中的初始值True.对于这些字段,Django将带有初始值的隐藏输入元素呈现到GET表单的HTML中.稍后,当您调用has_changedchanged_data在POST表单上时,对于任何字段,show_hidden_initial因为TrueDjango将自动从POST数据中的隐藏输入元素获取初始值(取代initial表单或字段参数中的任何初始值).注意:与依赖POST数据的任何内容一样,这种方法最终是不可靠的,因为隐藏输入的值尽管被隐藏仍然可以更改.


Flo*_*ner 6

您可以在两个条件下依赖这些方法:

  1. 您也可以在发布请求期间将初始数据dict传递给表单构造函数.
  2. 你不使用字段show_hidden_initial=True.(这些字段的问题是用户也可以提交用于比较的初始值,因此它不值得信任.)