预填充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
基于类的视图方法是重写FormView
的get_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