预填充Django(非模型)表单

我试图基于一些信息预填充我的Django表单中的数据,但不使用ModelForm,所以我不能只设置实例。

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

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) 

这不起作用。

尝试:

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

Form对象的构造函数可以使用字段值的字典。 这将创build一个绑定的表单,可用于validation数据并将数据显示为HTMLforms。 有关更多详细信息,请参阅窗体API文档。

编辑:

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

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

有关详细信息,请参阅初始值的文档。

有两种填充Django表单的方法。

首先是在实例化时传递字典作为第一个参数(或者将其作为data kwarg传递,这是相同的事情)。 这就是当你想使用POST数据来填充和validation表单时你所做的事情。

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

但是,这将在表单上触发validation ,所以只有在您真正传入有效且完整的数据时才有效 – 否则您将以错误开始。

填充表单的另一种方法是使用initial参数( 在此logging )。 这给了表单字段的初始值,但不会触发validation。 例如,如果你没有填写所有的值,那么它是合适的。

 form = MyForm(initial=data_dict) 

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

您可以使用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

对于什么是值得的,基于FormView基于类的视图方法是重写FormViewget_initial函数。 get_initial返回get_initial用于实例化表单的初始关键字参数。

文档:

  • 对于get_initial , 在这里 ,
  • 对于get_form_kwargs , 这里 。

示例代码:

 from django.views.generic.edit import FormView class MyFormView(FormView): def get_initial(self): initial = super(MyFormView, self).get_initial() # update initial field defaults with custom set default values: initial.update({'charfield1': 'foo', 'charfield2': 'bar'}) return initial