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)
此表单未绑定.验证未触发,因此渲染模板时不会显示任何错误.
不,这不是什么区别(我有兴趣知道文档在哪里得到了这种印象).不同之处在于是否执行验证.
初始数据不会触发验证.例如,这允许您预先填充某些字段,但将其他字段留空,即使它们是必需的.如果您使用绑定数据,即使在第一次查看该表单时,您也会收到那些空的必填字段的错误,这对用户来说会很烦人.
当然,绑定数据会触发验证.此外,如果您使用的是模型,则只会使用绑定数据而不是初始数据更新相关实例.