27

これは、Django プロジェクトに取り組んでいるときに発生した問題です。フォームバリデーションについてです。

Django では、送信されたフォームがある場合is_valid()、対応するフォーム オブジェクトを呼び出して検証をトリガーし、ブール値を返すことができます。したがって、通常、ビュー関数内に次のようなコードがあります。

if form.is_valid():
    # code to save the form data

is_valid()フォーム データを検証するだけでなく、後でユーザーに表示できるエラー メッセージをフォーム オブジェクトに追加します。

1 つのページで 2 つのフォームを一緒に使用し、両方のフォームに有効なデータが含まれている場合にのみデータを保存したいと考えています。つまりis_valid()、コードを実行してデータを保存する前に、両方のフォームを呼び出す必要があります。最も明白な方法:

if form1.is_valid() and form2.is_valid():
    # ...

論理演算子の短絡評価のために機能しません。form1が有効でない場合はform2評価されず、エラー メッセージが表示されません。

これはほんの一例です。私の知る限り、他の言語 (つまり Smalltalk) のようにand/に代わる貪欲な方法はありません。orその問題がさまざまな状況で発生することは想像できます (Python だけでなく)。私が考えることができる解決策は、すべての種類の不器用です (ネストされたifs、戻り値をローカル変数に割り当て、それらをifステートメントで使用する)。この種の問題を解決するためのpythonicな方法を知りたいです。

4

3 に答える 3

39

次のようなものはどうですか:

if all([form1.is_valid(), form2.is_valid()]):
   ...

一般的なケースでは、リスト内包表記を使用して、結果を前もって計算することができます (このコンテキストで一般的に使用されるジェネレーター式とは対照的に)。例えば:

if all([ form.is_valid() for form in (form1,form2) ])  

これは、任意の数の条件にもうまくスケールアップします...唯一の問題はandif foo and bar or baz: ....

(非短絡の場合は、の代わりにor使用できます)。anyall

于 2012-09-05T12:32:46.297 に答える
27

単純に二項演算子を使用できます&。これは、ブール値に対して非短絡論理ANDを実行します。

if form1.is_valid() & form2.is_valid():
   ...
于 2012-09-05T12:43:30.777 に答える