我正在为部件创建“订单”表单。
我的AddOrderForm
有Order
个模型字段(例如quantity
),但同时来自Part
模型的部分相关信息(如name_in_english
)和PartNumber
模型(如number
)和其他一些字段...
首先我为每个人分别ModelForm
,他们将它们合并为:
class PartNumberForAddOrderForm(forms.ModelForm):
class Meta:
model = PartNumber
fields = ('number',)
class PartForAddOrderForm(forms.ModelForm):
class Meta:
model = Part
fields = ('manufacturer','name_in_english')
class AddOrderForm(forms.ModelForm):
class Meta:
model = Order
fields = ('quantity',)
模板中的:
<form class="form-inline well" id="add_order">
<div class="row-fluid">
<div class="span12">
{% crispy form_part_number %}
{% crispy form_part %}
{% crispy form_order %}
<input type="submit" class="btn btn-primary pull-right" value="{% trans 'Add' %}"/>
</div>
</div>
</form>
这个观点成了:
form_part_number.is_valid() and form_part.is_valid() and form_order.is_valid():
这一切看起来都很丑陋而且错了......
所以我创造了另一种方式:
class PartForm(forms.ModelForm):
class Meta:
model = Part
fields = ('manufacturer','name_in_english')
class PartNumberForm(forms.ModelForm):
class Meta:
model = PartNumber
fields = ('number',)
class AddOrderForm(forms.ModelForm):
manufacturer = PartForm.base_fields['manufacturer']
name_in_english = PartForm.base_fields['name_in_english']
number = PartNumber.base_fields['number']
class Meta:
model = Order
fields = ('manufacturer','number','quantity','name_in_english')
问题:这是Form.base_fields['']
合法的方式吗?我认为.save()
无效,但.is_valid()
应该没问题,对吧?有没有更好的方法呢?
我可以在任何地方做任何有用的事情,所以这是我自己提出来的。这让我很担心。
由于
答案 0 :(得分:1)
is_valid()
调用可能会正确验证各个字段,但可能会忽略其他模型验证,例如unique_together
语句或其他模型之一的自定义clean
方法
我不认为检查多个表单的is_valid()
是那么难看。我以前用过它,立刻明白你在做什么。但是,我以前从未见过有人通过从其他表单base_fields
中抓取字段来定义表单。这并不意味着它不起作用,但它是非常规的。
如果你真的担心它很难看,你可以做类似以下的事情:
my_forms = [form_part_number, form_part, form_order]
if all(f.is_valid() for f in my_forms):
...