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

sla*_*acy 21 python django django-forms

举个这样的例子:

class MyForm(forms.Form): 
    name = forms.CharField()
Run Code Online (Sandbox Code Playgroud)

我试图了解以下两个片段之间的区别是:

"绑定数据"风格:

my_form = MyForm({'name': request.user.first_name})
Run Code Online (Sandbox Code Playgroud)

"初始数据"风格:

my_form = MyForm(initial={'name': request.user.first_name})
Run Code Online (Sandbox Code Playgroud)

文档似乎暗示"初始是动态初始值",但能够将"绑定数据"传递给构造函数完成完全相同的事情.我过去曾使用过初始数据来表示动态值,但我很想使用更简单的"绑定数据"样式,但想了解这两种样式之间真正区别的一些见解.

Ala*_*air 36

这是关于绑定和未绑定表单的django文档的关键部分.

Form实例绑定到一组数据或绑定:

  • 如果它绑定到一组数据,它就能够验证该数据并将表单呈现为HTML,并在HTML中显示数据.
  • 如果它是未绑定的,则无法进行验证(因为没有要验证的数据!),但它仍然可以将空白表单呈现为HTML.

您无法真正看到您给出的示例表单的区别,因为表单在"绑定数据"样式中有效.让我们通过添加一个age字段来扩展表单,然后差异将更加明显.

class MyForm(forms.Form):
    name = forms.CharField()
    age = forms.IntegerField()
Run Code Online (Sandbox Code Playgroud)

约束形式

my_form = MyForm({'name': request.user.first_name})
Run Code Online (Sandbox Code Playgroud)

此表单无效,因为age未指定.在模板中呈现表单时,您将看到该age字段的验证错误.

带有动态初始数据的未绑定表单

my_form = MyForm(initial={'name':request.user.first_name})
Run Code Online (Sandbox Code Playgroud)

此表单未绑定.验证未触发,因此渲染模板时不会显示任何错误.

  • 另外,`initial`和`data`的格式可以不同.如果在表单上使用前缀,那么作为`data`传递的内容将在键中具有前缀,而在`initial`中不需要前缀. (5认同)

Dan*_*man 7

不,这不是什么区别(我有兴趣知道文档在哪里得到了这种印象).不同之处在于是否执行验证.

初始数据不会触发验证.例如,这允许您预先填充某些字段,但将其他字段留空,即使它们是必需的.如果您使用绑定数据,即使在第一次查看该表单时,您也会收到那些空的必填字段的错误,这对用户来说会很烦人.

当然,绑定数据会触发验证.此外,如果您使用的是模型,则只会使用绑定数据而不是初始数据更新相关实例.