Django表单“初始值”和“绑定数据”的区别?
给出一个这样的例子:
class MyForm(forms.Form):
name = forms.CharField()
我想弄清楚下面这两段代码有什么区别:
“绑定数据”风格:
my_form = MyForm({'name': request.user.first_name})
“初始数据”风格:
my_form = MyForm(initial={'name': request.user.first_name})
文档似乎暗示“初始数据是用于动态初始值”,但实际上将“绑定数据”传递给构造函数也能实现完全相同的效果。我过去用过初始数据来处理动态值,但我现在更倾向于使用更简单的“绑定数据”风格。不过,我想了解这两种风格之间的真正区别是什么。
3 个回答
4
另一个区别是,data
需要一些小部件可以解析的内容,而 initial
是针对每个字段的。这在你使用 MultiWidget
的时候会有所不同。在这种情况下,data
应该包含类似于:
{'myfield_0': 'data for subwidget 0',
'myfield_1': 'data for subwidget 1'}
而 initial
则期望类似于:
{'myfield': 'data for subwidget 0,data for subwidget 1'}
8
不,这不是它们之间的区别(我很想知道你从哪个文档得出的这个印象)。它们的区别在于是否进行验证。
初始数据不会触发验证。这意味着你可以预先填写某些字段,而让其他字段保持空白,即使这些字段是必填的。如果你使用绑定数据,第一次查看表单时就会因为那些空的必填字段而出现错误,这对用户来说会很烦人。
当然,绑定数据会触发验证。而且,如果你使用的是模型表单,相关的实例只会用绑定数据进行更新,而不会用初始数据。
48
这是来自django文档中关于绑定和未绑定表单的关键部分。
一个表单实例要么是绑定到一组数据,要么是未绑定:
- 如果它是绑定的,说明它可以验证这些数据,并且可以把表单渲染成HTML,显示出这些数据。
- 如果它是未绑定的,就不能进行验证(因为没有数据可以验证!),但仍然可以把空表单渲染成HTML。
对于你给出的示例表单,实际上看不出两者的区别,因为这个表单在“绑定数据”情况下是有效的。我们可以通过添加一个age
字段来扩展这个表单,这样区别就会更明显。
class MyForm(forms.Form):
name = forms.CharField()
age = forms.IntegerField()
绑定表单
my_form = MyForm({'name': request.user.first_name})
这个表单是无效的,因为没有指定age
。当你在模板中渲染这个表单时,会看到age
字段的验证错误。
未绑定表单,带动态初始数据
my_form = MyForm(initial={'name':request.user.first_name})
这个表单是未绑定的。没有触发验证,所以在渲染模板时不会显示任何错误。