Django:从不同的模型创建一个表单

时间:2012-12-01 15:40:56

标签: django django-forms

我正在为部件创建“订单”表单。

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

这一切看起来都很丑陋而且错了......

所以我创造了另一种方式:

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 个答案:

答案 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):
    ...