検証済みのフォームにエラーを挿入しますか?


97

form.Formユーザー入力値を検証した後、さらに処理するためにそれらを別の(外部)プロセスに渡します。この外部プロセスにより、値のさらなるエラーが見つかる可能性があります。

これらのエラーを既に検証済みのフォームに挿入して、通常のフォームエラー表示メソッドを介して表示できるようにする方法はありますか(または、より優れた代替アプローチがあります)?

1つの提案は、フォーム検証に外部処理を含めることでした。これは、外部プロセスが単に検証するだけではないため、理想的ではありません。

回答:


92

Form._errors標準の辞書のように扱うことができます。ErrorListクラスを使用し、既存のリストにエラーを追加するのは良い方法と考えられています:

from django.forms.utils import ErrorList
errors = form._errors.setdefault("myfield", ErrorList())
errors.append(u"My error here")

フィールド以外のエラーを追加する場合は、の代わりにdjango.forms.forms.NON_FIELD_ERRORS(デフォルトは"__all__")を使用し"myfield"ます。


2
「_errors」という名前はフォームクラスの内部にあると考えられるため、これは少し不快に思えます。これはDjangoでこれを行うための標準的な方法ですか?私はOPに似た状況にあります。データベース内で一意でなければならない新しい名前をユーザーが提供するフォームがあります。衝突が発生した場合は、エラーを含むフォームを送りたいのですが、実際にデータベースの挿入を試みるまではわかりません。(理論的には、バリデーターはデータベースをチェックすることができますが、それはにおいがしてレースが発生しやすいです。)
Weeble

1
@scompt:ありがとう、修正されました。@Weeble:_errorsその名前にもかかわらず、パブリックフォームAPIの一部です。ドキュメントのリンクについては、insinの回答を参照してください。
ジョンミリキン、

18
これは信じられないほど非pythonicです。form.errors ['myfield']。append(my_error)またはform.add_error( 'myfield'、my_error)を実装するのはどれくらい大変でしたか?現在の実装では、エラーの余地がかなりあります(しゃれは意図されていません)。
マイケル

2
ほとんど完成しました。1つの余分ノートは()IS_VALIDが呼び出されなかった場合、その後、あなたがセットform._errors = ErrorDict()する必要がありますということです
ヤコブ

12
@Michael-彼らはあなたの忠告をしたように見えます... Django Dev-Form.add_error(field、error)
Clayton


14

6
そして、どうやらポスト1.6開発版では、彼らが追加されているadd_error機能を:docs.djangoproject.com/en/dev/ref/forms/api/...
brianmearns

そして今、Djangoの1.7は公式add_error機能を持っていますdocs.djangoproject.com/en/1.7/ref/forms/api/...
ダニーロカベヨ

0

特定のフィールドにエラーを追加:

form.add_error('fieldName', 'error description')

**非フィールドにエラーを追加します**

form.add_error(None, 'error description')
#Only pass None instead of field name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.