djangoの便利なテンプレートを利用して、バリデーションを作成して実験をしたところ、__all__という謎表示が出現したのでその原因と解決方法を紹介します。
コンテンツ
エラーが発生した環境
・django 2.1
・python3.8
発生したエラー
バリデーションエラーを作成し、template側にもエラーが出現するようなコードを書き、実際にエラーを発生させたところこのような画面になりました。
ちなみに英語の意味は「10分以内に更新してまた更新しようとしてもできないよ」
って内容の自作エラーです。
実際に書いたコード
こちらは個別のバリデーションではなく、全体のバリデーションが必要だったのでclean(self)を使用しています。
ここのclean(self)で書いたコードはあとで原因解決を理解する一部になります。
forms.py
1 2 3 4 5 6 7 8 |
def clean(self): cleaned_data = super().clean() current_time_utc = datetime.now(timezone.utc) qs = InquiryComment.objects.get(id=self.comment_id) updated_at_plus_some_min = qs.updated_at + timedelta(minutes=(10)) if current_time_utc < updated_at_plus_some_min: raise forms.ValidationError('After updating, you will not be able to re-update 10 minutes after updating.') return cleaned_data |
edit_comment.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<form action="" method="POST"> {% csrf_token %} <table class="inquiry_table"> <tr> <th>Inquiry status:</th> <td>{{ form.inquiry_status }}{{ form.inquiry_status.errors }}</td> </tr> <tr> <th>Comment:</th> <td>{{ form.comment }}{{ form.inquiry_comment.errors }}</td> </tr> <tr> <th></th> <td> <button type="submit" class="btn">Update</button> {{ form.errors }} </td> </tr> </table> |
原因
実はこの原因は、
edit_comment.htmlの16行目
1 |
{{ form.errors }} |
の書き方と理解不足が原因でした。
基本的に各フォームフィールドは、その名前に従って、上の{{ 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 }}で解決することができるのです。
今度はきれいにエラーが表示されました。