django __all__のエラー原因と解決方法

djangoの便利なテンプレートを利用して、バリデーションを作成して実験をしたところ、__all__という謎表示が出現したのでその原因と解決方法を紹介します。

エラーが発生した環境

環境

・django 2.1

・python3.8

発生したエラー

バリデーションエラーを作成し、template側にもエラーが出現するようなコードを書き、実際にエラーを発生させたところこのような画面になりました。

ちなみに英語の意味は「10分以内に更新してまた更新しようとしてもできないよ」

って内容の自作エラーです。

ヒロヤン
英単語だけが出現するバリデーションをしたつもりが、謎の__all__が出現しました。なんだこれは!?

実際に書いたコード

こちらは個別のバリデーションではなく、全体のバリデーションが必要だったのでclean(self)を使用しています。

ここのclean(self)で書いたコードはあとで原因解決を理解する一部になります。

forms.py

edit_comment.html

ヒロヤン
何が原因なのか全くわかりません。

原因

実はこの原因は、

edit_comment.htmlの16行目

の書き方と理解不足が原因でした。

ヒロヤン
使用した理由も、全体のフィールドに関与するバリデーションは{{ form.erros }}だろうという、勝手な解釈でした。

基本的に各フォームフィールドは、その名前に従って、上の{{ form.comment }}のように出力できます。

{{ form.comment.errors }}はフォームエラーのリストを作成できます。

form.error はそもそもバックバックエンド側で辞書型のエラーメッセージを表示させる方法で、template側で使用する使い方はどこにもありませんでした・・・。

解決方法

{{ form.errors }} → {{ form.non_field_errors }}

に書き直します。

{{ form.non_field_errors }} は特定のフィールドに紐づかないエラーを出力するためのテンプレートになります。

つまり個別でforms.pyに書いたclean_comment(self)という箇所でバリデーションエラーを出力させる場合は、{{ form.comment.errors }}と書いますが、

clean(self)で書いた特定のフィールドに紐づかないエラーを出力する際は

{{ form.non_field_errors }}で解決することができるのです。

今度はきれいにエラーが表示されました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です