2

部品の「注文」フォームを作成しています。

AddOrderFormにはOrderモデル フィールド ( などquantity) がありますが、同時に、Partモデル ( などname_in_english) とPartNumberモデル ( など) からのパーツ関連の情報numberと、その他のフィールドがいくつかあります...

まず、それぞれを個別ModelFormに実行し、次のように組み合わせました。

フォーム.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()ますが、うまくいくはずですよね?それを行うより良い方法はありますか?

私はどこでも役立つものを何でも見つけることができるので、これは私が自分で思いついたものです. それは私を心配しています。

ありがとう

4

1 に答える 1

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):
    ...
于 2012-12-01T16:14:05.893 に答える