DjangoでFormのエラーメッセージをテンプレートで取得する方法

DjangoFormテンプレート

Djangoでフォームエラーのメッセージ表示する方法

Djangoでログインフォームなどでエラーが出た時にメッセージを表示するのにテンプレート利用するコードです。

{% if form.non_field_errors %}
<ul class="alert alert-danger list-unstyled">
    <li style="list-style-type: none;">
<ul class="alert alert-danger list-unstyled">{% for error in form.non_field_errors %}
    <li>{{ error }}</li>
</ul>
</li>
</ul>
{% endfor %}

{% endif %}

※classはBootstrapでの使用を想定しています。適宜変更してご利用ください。

上のコードをform-alart.htmlで保存し、アラートを表示したいところに

{% include 'path/to/form-alert.html' %}

を挿入すると使い回せるので便利です。

例外の発生のさせ方によってform.non_field_errors()にメッセージが入らない場合があります。

Form.clean() をオーバーライドして発生させた例外は、特定のフィールドに結びつかない点に注意してください。これらは特別な “フィールド” (__all__ と呼ばれます) に格納され、必要に応じて non_field_errors() メソッドを通じてアクセスできます。特定のフィールドにエラーを紐付けて格納したい場合は、add_error() を呼び出す必要があります。

出典:Djangoドキュメント

この説明でいまいちピンとこない方のため例を示すと

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email', 'password')
        labels = {'email': 'メールアドレス', 'password': 'パスワード'}

    def clean_email(self):
        email = self.cleaned_data['email']
        User.objects.filter(email=email, is_active=False).delete()
        if User.objects.filter(email=email).count() != 0:
            raise forms.ValidationError(
            "このメールアドレスは既に登録されています。"
            )
        return email

    def clean(self):
        cleaned_data = super(UserForm, self).clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError(
            "パスワードが一致しませんでした。パスワードを入力し直してください。"
            )

上記のコードでdef clean(self)のエラーメッセージはform.non_field_errorsで取得。

def clean_email(self):のエラーメッセージはform.non_field_errors`で取得できないのでこれから紹介する方法で取得します。

例外の発生させ方に関係なくエラーメッセージを表示する場合

{{ form.errors }}

でフィールドとメッセージのディクショナリーを取得できます。

シンプルにこのようにform.errorsをfor文で順番に取り出せます。

{% for error in form.errors %}
{{ error }}
{% endfor %}

入力フォームごとにエラーメッセージ表示する方法

テンプレートでフィールドを指定して、1つずつ表示する場合はこのように書きます。

(例)email フィールドの場合

{{ form.email }}

その前後のエラーメッセージを表示したいところに下記のコードを追加します。

{{ form.email.errors }}

全体像としてはこのようになります。

<label for="id_email">メールアドレス&lt;/&gt;
{{ form.email.errors }}
{{ form.email }}

これで、メールアドレスの入力に誤りがあった場合にエラーを表示できます。

Djangoフォームバリデーションのエラーメッセージのまとめ

最後に今回の内容をまとめると

  1. Formの中でどうcleanするかでエラーメッセージをの呼び出し方が変わる。
  2. `clean(self)`は`form.non_field_errors()`から取り出す。
  3. `clean_name(self)`は`form.errors`もしくは、`form.name.erros`で取り出す。

この3つを押さえていれば良さそうです。

DjangoのFormの使い方はあまり理解できていなかったのでブログを書いていて勉強になりました。

この記事を読んでくれた方の参考になれば幸いです。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください