2009-06-01 117 views
44

我想基于一些信息预填充我的django表单中的数据,但不使用ModelForm,所以我不能只设置实例。Prepopulate Django(非模型)表格

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

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) 

不工作。

回答

79

尝试:

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

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

编辑:

为了完整起见,如果你不想绑定的形式,而你只是想为某些字段声明的初始值,你可以改用以下内容:

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

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

+0

感谢 - 这工作。但是,它不适用于模型的外键。我尝试传递模型实例本身在字典中,这引发了一个异常,并且我尝试传入pk/id,但不会失败,但不会在我的表单UI中正确预加载它。 – Cory 2009-06-01 20:02:16

+0

使用对象ID应该工作。我刚刚使用ModelChoiceField对其进行了测试。你能向我们展示你的表单定义吗? – 2009-06-01 20:13:31

23

有两种填充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值。

12

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

1

对于它的价值,在FormView基于类的视图的方式做这将是覆盖FormViewget_initial功能。get_initial返回get_form_kwargs使用的初始关键字参数来实例化表单。

文档:

  • get_initialhere
  • get_form_kwargshere

示例代码:

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