给出一个这样的例子:
class MyForm(forms.Form):
name = forms.CharField()
我正在努力了解以下两个片段之间的区别:
“绑定数据”样式:
my_form = MyForm({'name': request.user.first_name})
“初始数据”样式:
my_form = MyForm(initial={'name': request.user.first_name})
文档似乎暗示“初始是动态初始值”,但是能够将“绑定数据”传递给构造函数完成了完全相同的事情。我过去曾使用过初始数据来表示动态值,但我很想使用更简单的“绑定数据”样式,但想了解这两种样式之间真正区别的一些见解。
答案 0 :(得分:36)
以下是bound and unbound forms上django文档的关键部分。
表单实例绑定到一组数据,或未绑定:
- 如果它绑定到一组数据,它就能够验证该数据并将表单呈现为HTML,并在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})
此表单未绑定。验证未触发,因此渲染模板时不会显示任何错误。
答案 1 :(得分:7)
不,这不是什么区别(我有兴趣知道你在文档中的哪个位置得到了这种印象)。不同之处在于是否进行了验证。
初始数据不会触发验证。例如,这允许您预先填充某些字段,但将其他字段留空,即使它们是必需的。如果您使用了绑定数据,那么即使在第一次查看该表单时,您也会收到那些空的必填字段的错误,这对用户来说会很烦人。
绑定数据当然会触发验证。此外,如果您使用的是模型,则只会使用绑定数据而不是初始数据更新相关实例。
答案 2 :(得分:3)
另一个区别是data
期望小部件可以解析的内容,而initial
是每个字段。如果你这样做会有所不同使用MultiWidget
s。在这种情况下,data
应包含类似
{'myfield_0': 'data for subwidget 0',
'myfield_1': 'data for subwidget 1'}
而initial
期望这样的事情:
{'myfield': 'data for subwidget 0,data for subwidget 1'}