Django Form“initial”和“bound data”之间的区别?

2024-06-16 10:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

举一个这样的例子:

class MyForm(forms.Form): 
    name = forms.CharField()

我试图弄清楚以下两个片段之间的区别:

“绑定数据”样式:

my_form = MyForm({'name': request.user.first_name})

“初始数据”样式:

my_form = MyForm(initial={'name': request.user.first_name})

文档似乎建议不要使用“initial用于动态初始值”,但是能够将“绑定数据”传递给构造函数完成完全相同的事情。在过去,我使用初始数据作为动态值,但我倾向于使用更直接的“绑定数据”样式,但希望了解这两种样式之间的真正区别。


Tags: 数据nameformrequestmy动态样式forms
3条回答

这是django文档中关于bound and unbound forms的关键部分。

A Form instance is either bound to a set of data, or unbound:

  • If it’s bound to a set of data, it’s capable of validating that data and rendering the form as HTML with the data displayed in the HTML.
  • If it’s unbound, it cannot do validation (because there’s no data to validate!), but it can still render the blank form as 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})

此表单未绑定。不会触发验证,因此在呈现模板时不会显示任何错误。

另一个区别是data期望小部件可以解析的内容,而initial是每个字段。如果您使用MultiWidgets,这会有所不同。在这种情况下data应该包含如下内容

{'myfield_0': 'data for subwidget 0', 
 'myfield_1': 'data for subwidget 1'}

initial期望的是这样的:

{'myfield': 'data for subwidget 0,data for subwidget 1'}

不,这不是区别所在(我想知道你在文档中是从哪里得到这种印象的)。区别在于是否执行验证。

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

当然,绑定数据会触发验证。此外,如果您使用的是modelform,则相关实例将仅使用绑定数据而不是初始数据进行更新。

相关问题 更多 >