Django表单“初始”和“绑定数据”之间的区别?

时间:2011-10-27 17:49:07

标签: python django django-forms

给出一个这样的例子:

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 个答案:

答案 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'}