我正在尝试根据一些信息预先填充我的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)
哪个不起作用。
答案 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)