在Django中以编辑形式(数据预填充)传递整个初始对象

时间:2012-05-22 02:32:07

标签: python django django-forms

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

目前,我使用initial中的forms.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

3 个答案:

答案 0 :(得分:1)

  

我有一个非常复杂的表单,因此我选择不使用ModelForm   我需要灵活性和控制领域

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

  

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

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

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

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

form = OrderForm(initial=initial)

答案 1 :(得分:1)

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

order_form = OrderEditForm(order.__dict__())

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

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

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

然后用以下内容构建表单:

order_form = OrderEditForm(order_initial)

查看this示例(如何在“发布”时间填充值):

答案 2 :(得分: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)

我从this blog得到了解决方案。我希望这会对某人有所帮助。