2012-12-01 85 views
1

我正在为部件创建“订单”表单。Django:从不同型号创建表格

AddOrderFormOrder模型字段(如quantity),但在同一时间从Part模型的一些部分相关的信息(如name_in_english)和PartNumber型号(如number)和其他一些领域......

首先我做独立ModelForm为每一个和他们结合他们是这样的:

forms.py

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():

这一切看起来丑陋SUPER,只是错误的...

因此,我创建了另一种方式:

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()应该没问题吧?有没有更好的方法来做到这一点?

我可以罚款任何有用的地方,所以这是我想出了自己的东西。那让我很担心。

感谢

回答

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): 
    ... 
+0

f.is_valid()! – danihp

+0

@Alasdair,在我的实际案例中,我必须用一种形式使用5个“表格” - 其中2个是由于我想要的字段的顺序。但是让我感到厌恶的是,我在一种实际的形式中使用了多种“形式”。我是Django的新手,并试图弄清楚事情的真相。 –

+0

我仍然坚持'base_fields' ...到目前为止这么好。谢谢你,阿拉斯代尔 –