0

我有一个非常复杂的表格,我选择不使用ModelForm,因为我需要灵活性和对字段的控制。由于我没有使用ModelForm,我不能简单地做类似instance=order, where的事情order = Order.objects.get(pk=1)

目前,我正在预先填充每个字段,与initialforms.py相反views.py

self.fields['work_type'] = forms.ChoiceField(choices=Order.WORK_TYPE_CHOICES, initial=order.work_type)

但我想知道是否可以将整个order对象传递给表单,还是必须向initial每个字段声明?

有没有办法做类似的事情

order_form = OrderEditForm(data=request.POST, initial=order)

views.py

4

3 回答 3

1

我有一个非常复杂的表单,我选择不使用 ModelForm,因为我需要灵活性和对字段的控制

您可以使用表单执行的所有操作,都可以在 ModelForm 中执行,例如添加新字段或覆盖字段上的属性等。

但我想知道是否可以将整个订单对象传递给表单,还是必须为每个字段声明初始值?

您可以将订单对象传递到表单中,但您仍然必须在表单或视图函数中单独填充每个字段。

所以在你看来,你会做这样的事情:

intial = {'order_number': order.number, 'order_id': order.id}

form = OrderForm(initial=initial)
于 2012-05-22T03:05:25.423 回答
1

将数据预填充到表单的最简单方法是将字典作为第一个参数传递给表单构造函数。

order_form = OrderEditForm(order.__dict__())

where__dict__()是将“订单”对象属性传递给字典的方法,其中每个属性的名称作为键,它们的内容作为值。

如何“发明”这种方法的一个例子可能是这样的:

order_initial = Order.objects.filter(pk=order.pk).values()[0]

然后构造表单:

order_form = OrderEditForm(order_initial)

这个例子(他们如何在“发布”时间填充值):

于 2012-05-22T03:07:32.943 回答
0

供其他人参考:

我在阅读了 SO 的评论和答案后发现,ModelForm即使您最终手动明确定义每个字段(使用类似的东西self.fields['foo'] = forms.CharField()),也最好使用它。

在任何情况下,如果您尝试在表单中传递当前值的字典,那么将模型转换为字典的最佳(内置)方法实际上是使用model_to_dict

from django.forms.models import model_to_dict

order = Order.objects.get(pk=1)
dictionary = model_to_dict(order)
form = OrderEditForm(dictionary)

我从这个博客得到了解决方案。我希望这对某人有帮助。

于 2012-05-26T11:49:14.877 回答