预填充Django(非模型)表单

Cor*_*ory 53 django django-forms

我试图根据一些信息预先填充我的django表单中的数据,但不使用ModelForm,所以我不能只设置实例.

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

class MyForm(forms.Form):
  charfield1 = forms.CharField(max_length=3)
  charfield2 = forms.CharField(max_length=3)
  choicefield = forms.ModelChoiceField(MyModel.objects.all())
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)
Run Code Online (Sandbox Code Playgroud)

这不起作用.

Aym*_*ieh 90

尝试:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*man 26

填充Django表单有两种方法.

第一种是在实例化时将字典作为第一个参数传递(或者将其作为datakwarg传递,这是相同的事情).当您要使用POST数据填充和验证表单时,可以执行此操作.

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)
Run Code Online (Sandbox Code Playgroud)

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

填充表单的另一种方法是使用initial参数(此处记录).这使初始值的表单字段,但并不会触发验证.因此,如果您没有填写所有值,那么它是合适的.

form = MyForm(initial=data_dict)
Run Code Online (Sandbox Code Playgroud)

要填充选择字段initial,请使用pk值.


And*_*der 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))
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用django 1.3版


Jos*_*mit 5

对于它的价值,FormView基于类的视图方法是覆盖FormViewget_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
Run Code Online (Sandbox Code Playgroud)