12

私は本当にdjangoフォームセットが混乱していると感じています。

特に、よくわからない次の概念に問題があります。

フォームセットは、変更されていない余分なフォームを無視するほどスマートです。

スマートになりすぎようとしているコードについて話します。これは正確にはどういう意味ですか?なぜ私はそれが欲しいのですか?

それから、前の概念を理解しようとすると、人が見えます

必要なフォームセットでフォームを作成します。

これは、私が理解できない別の概念です。フォームセットの必須フォームとは何ですか? なぜフォームを必須にする必要があるのですか? 再び文書化されていないもの。

次に、他の人が抱えていたように見える私の実際の問題に行き着きますが、彼らはなぜ自分たちが修正した方法で修正したのかを本当に説明することはできません.

次の例では、同じ入力を持つ個々のフォームが無効になるのに、なぜフォームセットは有効なのですか?

import django
class MyForm(django.forms.Form):
    start = django.forms.DateField()
    end = django.forms.DateField()

data =  {
    'form-TOTAL_FORMS': '1',
    'form-MAX_NUM_FORMS': '',
    'form-INITIAL_FORMS': '0',
    'form-0-start': '',
    'form-0-end': '',
}

MyFormSet = formset_factory(MyForm)
formset = MyFormSet(data)
#fee_forms[0].empty_permitted = False

print formset.is_valid()
# --- returns True ---
print formset.errors

f = MyForm({'start': '', 'end': ''})
print f.is_valid()
# --- returns False ---
print f.errors

empty_permitted を False に設定すると、期待どおりの結果が得られるようです (これは、「開始」と「終了」がないためにフォームセットが無効になるためです)。これは別の文書化されていない機能です...

誰かが説明する時間を割いてくれませんか?

ありがとうございました

4

1 に答える 1

22

フォームセットは、変更されていない余分なフォームを無視するほどスマートです。

スマートになりすぎようとしているコードについて話します。これは正確にはどういう意味ですか?なぜ私はそれが欲しいのですか?

あなたが解決したように、フォームセットによって作成された「余分な」フォーム(extra=Nあなたの例では)がにempty_permitted設定されていることを意味しているようTrueです。これが起こっていることを一目で確認してください。django/forms/formsets.py

formset[0].empty_permittedの場合formset[0].has_changed() == False、それ以上の処理/検証は行われないことを意味します。繰り返しますが、これは で実際に見ることができますforms/forms.py

これを防ぐため、ブログ投稿modelformset_factoryでは、どのセット(またはinlineformset_factory) で使用するカスタム フォームセットを定義することを提案していますempty_permitted = False:

class MyModelFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(MyModelFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False

私はこれをテストしていませんが、合法的に見えます。

誰もがこれを欲しがる理由については、これを使う django-dynamic-formsetと非常に簡単になります — and にデータを送ることができform-0、それが追加のフォーム (つまりform-2、モデル データにリンクされていない) であると仮定すると、Django は文句を言いません。デフォルトの場合、独自のコードで空白のフォームをスキップしたり、Javascript でインデックスを再作成したりすることを心配する必要があります。form-1empty_permittedFalse

于 2013-06-01T23:05:10.703 に答える