HTML 以外のバージョンのフォームのエラーを自分のテンプレートで取得したいと考えています。
デフォルトでは、エラーは<ul class="errorlist">
回避したいラップアップです。
とにかく、大規模なコード変更なしでそれを行うには?
HTML 以外のバージョンのフォームのエラーを自分のテンプレートで取得したいと考えています。
デフォルトでは、エラーは<ul class="errorlist">
回避したいラップアップです。
とにかく、大規模なコード変更なしでそれを行うには?
Django 1.7 には、この問題を解決するのにも役立つ 2 つの新しいメソッドがあります。
>>> f.errors.as_data()
{'sender': [ValidationError(['Enter a valid email address.'])],
'subject': [ValidationError(['This field is required.'])]}
>>> f.errors.as_json()
{"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
"subject": [{"message": "This field is required.", "code": "required"}]}
Django 2.1 用に更新
ビューでフォーム エラーにアクセスするには、4 つのオプションがあります。
エラー属性にアクセスして、エラー メッセージの辞書を取得します。
f.errors
{'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}
このディクショナリでは、キーはフィールド名であり、値はエラー メッセージを表す文字列のリストです。フィールドには複数のエラー メッセージが含まれる可能性があるため、エラー メッセージはリストに格納されます。
最初に is_valid() を呼び出さなくてもエラーにアクセスできます。フォームのデータは、最初に is_valid() を呼び出したとき、またはエラーにアクセスしたときに検証されます。
エラーにアクセスする回数や is_valid() を呼び出す回数に関係なく、検証ルーチンは 1 回だけ呼び出されます。これは、検証に副作用がある場合、それらの副作用は一度だけトリガーされることを意味します。
フィールドを元の ValidationError インスタンスにマップする dict を返します。
f.errors.as_data()
{'sender': [ValidationError(['Enter a valid email address.'])],
'subject': [ValidationError(['This field is required.'])]}
コードでエラーを識別する必要がある場合はいつでも、このメソッドを使用してください。これにより、エラーのメッセージを書き換えたり、特定のエラーが存在するときにビューにカスタム ロジックを記述したりすることが可能になります。カスタム形式 (XML など) でエラーをシリアル化するためにも使用できます。たとえば、as_json() は as_data() に依存しています。
as_data() メソッドが必要なのは、下位互換性のためです。以前は、レンダリングされたエラー メッセージが Form.errors ディクショナリに追加されるとすぐに ValidationError インスタンスが失われていました。理想的には、Form.errors は ValidationError インスタンスを格納し、as_ プレフィックスを持つメソッドはそれらをレンダリングできますが、Form.errors でレンダリングされたエラー メッセージを予期するコードを壊さないようにするために、逆の方法で行う必要がありました。
JSON としてシリアル化されたエラーを返します。
f.errors.as_json()
{"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
"subject": [{"message": "This field is required.", "code": "required"}]}
デフォルトでは、as_json() はその出力をエスケープしません。クライアントが応答を解釈してページにエラーを挿入するフォーム ビューへの AJAX 要求などに使用している場合は、クロスの可能性を回避するためにクライアント側で結果をエスケープする必要があります。・サイトスクリプティング攻撃。jQuery のような JavaScript ライブラリを使用してこれを行うのは簡単です。単純に .html() ではなく $(el).text(errorText) を使用します。
何らかの理由でクライアント側のエスケープを使用したくない場合は、 escape_html=True を設定することもできます。エラー メッセージはエスケープされるため、HTML で直接使用できます。
f.errors.get_json_data(escape_html=False)
JSON へのシリアル化に適した辞書としてエラーを返します。Form.errors.as_json() はシリアル化された JSON を返しますが、これはシリアル化される前のエラー データを返します。
escape_html パラメータは、Form.errors.as_json() で説明されているように動作します。
特定のフィールドのエラーにアクセスするには、を使用しますform.field_name.errors
。「field_name」は、エラーを生成するフィールドの名前です。
フィールドで複数のエラーが生成された場合は、for ループを使用することをお勧めします。
大雑把な例:
{% for error in form.email.errors %}
<label>{{ error|escape }} </label>
{% endfor %}
<br>
<label>Email: </label>{{ form.email }}
一部のエラーは、特定のフィールドに特に関連していない場合があります。たとえば、2 つのパスワード フィールドが一致しない場合に発生するエラーです。それらは次の方法でアクセスできる必要があります。
{{ form.non_field_errors }}