我有一个非常复杂的表单,我选择不使用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
?
答案 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得到了解决方案。我希望这会对某人有所帮助。