65

我正在尝试根据一些信息在我的 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

4 回答 4

110

尝试:

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

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

编辑:

为了完整起见,如果您不想绑定表单,而只想为某些字段声明初始值,则可以改用以下内容:

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

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

于 2009-06-01T19:42:34.610 回答
31

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

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

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

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

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

form = MyForm(initial=data_dict)

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

于 2009-06-01T20:31:54.887 回答
15

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

于 2013-02-20T01:52:21.670 回答
5

对于它的价值,FormView基于类的视图方法将覆盖FormView'get_initial函数。返回用于实例化表单get_initial的初始关键字参数。get_form_kwargs

文件:

  • 对于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
于 2017-08-27T14:26:54.983 回答