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

Python 在Django中以编辑形式(数据预填充)传递整个初始对象,python,django,django-forms,Python,Django,Django Forms,我有一个非常复杂的表单,我选择不使用ModelForm,因为我需要灵活性和对字段的控制。因为我没有使用ModelForm,所以我不能简单地执行instance=order,其中order=order.objects.get(pk=1) 目前,我在forms.py中用initial预先填充每个字段,而不是像这样的views.py self.fields['work_type'] = forms.ChoiceField(choices=Order.WORK_TYPE_CHOICES, initial

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

目前,我在
forms.py
中用
initial
预先填充每个字段,而不是像这样的
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)
视图.py中

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

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

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

您可以将order对象传递到表单中,但仍然需要在表单或view函数中分别填充每个字段

所以在你看来,你应该这样做:

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

form = OrderForm(initial=initial)

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

order_form = OrderEditForm(order.__dict__())
其中
\uuuu dict\uuuu()
是一种将“order”对象属性传递到字典的方法,每个属性的名称作为键,其内容作为值

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

order_initial = Order.objects.filter(pk=order.pk).values()[0]
然后使用以下内容构建表单:

order_form = OrderEditForm(order_initial)

查看示例(它们如何在“post”时间填充值):

供其他人参考:

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

在任何情况下,如果您试图以某种形式传递当前值的字典,那么将模型转换为字典的最佳(内置)方法实际上是使用
model\u to\u dict

from django.forms.models import model_to_dict

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

我从你那里得到了答案。我希望这将对某人有所帮助。

为什么您不能从
get(pk=order.pk)
执行
values()
?因为get不会返回queryset。它返回一个对象。所以,如果您这样做,您将得到一个异常,因为您的对象(可能)不理解“值”消息。