预填充Django(非模型)表单

时间:2009-06-01 19:35:29

标签: django django-forms

我正在尝试根据一些信息预先填充我的django表单中的数据,但不使用ModelForm,所以我不能只设置实例。

这似乎应该很容易,但由于某种原因,我找不到任何文件告诉我如何做到这一点。这是我的表格:

class MyForm(forms.Form):
  charfield1 = forms.CharField(max_length=3)
  charfield2 = forms.CharField(max_length=3)
  choicefield = forms.ModelChoiceField(MyModel.objects.all())

我试过这样做:

form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)

哪个不起作用。

4 个答案:

答案 0 :(得分:86)

尝试:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})

Form个对象的构造函数可以使用字段值的字典。这将创建一个绑定表单,该表单可用于验证数据并将表单呈现为HTML并显示数据。有关详细信息,请参阅the forms API文档。

修改

为了完整起见,如果您不想绑定表单,并且只想声明某些字段的初始值,则可以使用以下代码:

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})

有关详细信息,请参阅initial values的文档。

答案 1 :(得分:26)

有两种方法可以填充Django表单。

第一种是在实例化时将字典作为第一个参数传递(或将其作为data kwarg传递,这是相同的事情)。当您想要使用POST数据填充和验证表单时,就会执行此操作。

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)

但是,这会触发表单上的验证,因此只有在您实际传入有效且完整的数据时才有效 - 否则您将从错误开始。

填充表单的另一种方法是使用initial参数(记录为here)。这为表单字段提供了初始值,但触发验证。因此,如果您没有填写所有值,那么它是合适的。

form = MyForm(initial=data_dict)

要通过initial填充选择字段,请使用pk值。

答案 2 :(得分:14)

您可以使用model_to_dict()将实例转换为字典,然后使用该字体填充表单。这样的事情应该有效:

from django.forms.models import model_to_dict
...
my_obj = MyModel.objects.get(abc=123)
form = MyForm(initial=model_to_dict(my_obj))

注意:我正在使用django 1.3版

答案 3 :(得分:3)

对于它的价值,FormView基于类的查看方式是覆盖FormView的{​​{1}}函数。 get_initial返回get_initial用来实例化表单的初始关键字参数。

文档:

  • 代表get_form_kwargshere
  • 代表get_initialhere

示例代码:

get_form_kwargs