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

28 投票
3 回答
19219 浏览
提问于 2025-04-17 05:07

给出一个这样的例子:

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 个回答

4

另一个区别是,data 需要一些小部件可以解析的内容,而 initial 是针对每个字段的。这在你使用 MultiWidget 的时候会有所不同。在这种情况下,data 应该包含类似于:

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

initial 则期望类似于:

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

不,这不是它们之间的区别(我很想知道你从哪个文档得出的这个印象)。它们的区别在于是否进行验证。

初始数据不会触发验证。这意味着你可以预先填写某些字段,而让其他字段保持空白,即使这些字段是必填的。如果你使用绑定数据,第一次查看表单时就会因为那些空的必填字段而出现错误,这对用户来说会很烦人。

当然,绑定数据会触发验证。而且,如果你使用的是模型表单,相关的实例只会用绑定数据进行更新,而不会用初始数据。

48

这是来自django文档中关于绑定和未绑定表单的关键部分。

一个表单实例要么是绑定到一组数据,要么是未绑定

  • 如果它是绑定的,说明它可以验证这些数据,并且可以把表单渲染成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})

这个表单是未绑定的。没有触发验证,所以在渲染模板时不会显示任何错误。

撰写回答