2012-12-01 84 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' ...到目前爲止這麼好。謝謝你,阿拉斯代爾 –