Gho*_*r21 18 django django-forms
从源代码中,您可以看到Django 1.4的Form
类具有一个看似相当有用的has_changed()
方法和changed_data
属性,但是没有记录.我的问题是:按预期完成这些工作,即:
Form.clean()
,Form.has_changed()
返回True
任何表单数据是否已更改,否则返回False
Form.clean()
,Form.changed_data
是值已更改的字段名称列表.如果是这样,除了使用未记录的功能的常见警告/危险之外,是否有任何具体原因不使用它们(即可能会有变化,不受支持等)?
注1:为了使这些小部件能够使用自定义小部件,这些小部件需要有一个_has_changed()
方法,该方法是为内置小部件定义的.
注2:有趣的是,文档确实包括Formset.has_changed()
方法的提及,但没有Form.has_changed()
.
Gho*_*r21 23
在进一步研究Django源代码后,有了弗洛里安答案的有用提示,我可以报告has_changed
并changed_data
按照我的问题中的描述进行工作,只要表单有一种方法可以获取初始数据来比较新数据.
所以问题是,从POST数据创建的表单如何知道GET表单的初始值是什么?简短的回答是它没有 - 除非你以某种方式告诉它.有两种方法可以告诉它:
通过initial
表单的关键字参数和/或initial
字段的关键字参数,与告诉GET形成初始值的方式完全相同.注意:如果您这样做,则由您决定是否为GET和POST表单使用相同的值.这是唯一真正可靠的方法,因为您可以直接控制初始值.
你让Django通过为每个适用的字段设置show_hidden_initial
关键字参数来记住GET中的初始值True
.对于这些字段,Django将带有初始值的隐藏输入元素呈现到GET表单的HTML中.稍后,当您调用has_changed
或changed_data
在POST表单上时,对于任何字段,show_hidden_initial
因为True
Django将自动从POST数据中的隐藏输入元素获取初始值(取代initial
表单或字段参数中的任何初始值).注意:与依赖POST数据的任何内容一样,这种方法最终是不可靠的,因为隐藏输入的值尽管被隐藏仍然可以更改.
您可以在两个条件下依赖这些方法:
show_hidden_initial=True
.(这些字段的问题是用户也可以提交用于比较的初始值,因此它不值得信任.) 归档时间: |
|
查看次数: |
10001 次 |
最近记录: |