Djangoフォームでバリデーションエラーを表示する方法を完全解説|初心者向け
生徒
「Djangoでフォームを作ったんですが、入力を間違えたときにエラーをどうやって表示するのかわかりません」
先生
「Djangoのフォームには、入力内容を自動でチェックする仕組みがあって、その結果を画面に表示できます」
生徒
「自分で全部チェックする必要はないんですか?」
先生
「基本的なチェックはDjangoがやってくれます。仕組みと表示方法を順番に見ていきましょう」
1. Djangoフォームとバリデーションエラーとは
Djangoフォームとは、ユーザーが画面から文字や数字を入力するための部品をまとめた仕組みです。名前やメールアドレス、年齢などを入力するときに使われます。
バリデーションエラーとは、入力内容がルールに合っていない場合に発生するエラーのことです。例えば「必須項目が空」「数字を入れる欄に文字が入っている」などが該当します。
Djangoでは、このチェック処理を自動で行い、その結果をエラーメッセージとしてフォームに保持してくれます。
2. forms.Formを使った基本的な入力チェック
まずは、もっとも基本的なフォームの作り方を見てみましょう。forms.Formは、入力項目とルールを定義するためのクラスです。
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(label="名前", max_length=20)
age = forms.IntegerField(label="年齢")
この例では、名前は20文字まで、年齢は数字である必要があります。もし文字を年齢欄に入れると、自動的にバリデーションエラーになります。
3. ビューでバリデーションエラーを判定する
フォームの入力が正しいかどうかは、ビューの中で確認します。is_validメソッドを使うことで、入力チェックの結果を判定できます。
from django.shortcuts import render
from .forms import ContactForm
def contact_view(request):
form = ContactForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
print("入力は正しいです")
else:
print("入力にエラーがあります")
return render(request, "contact.html", {"form": form})
is_validがFalseの場合、フォームの中にエラーメッセージが保存されています。
4. テンプレートでエラーメッセージを表示する方法
実際に画面へエラーを表示するには、テンプレートでフォームのエラー情報を出力します。以下は基本的な表示方法です。
<form method="post">
{% csrf_token %}
{{ form.non_field_errors }}
<div>
{{ form.name.label_tag }}
{{ form.name }}
{{ form.name.errors }}
</div>
<div>
{{ form.age.label_tag }}
{{ form.age }}
{{ form.age.errors }}
</div>
<button type="submit">送信</button>
</form>
errorsを表示することで、入力ミスがあった項目の下にエラーメッセージが表示されます。
5. Bootstrapを使ったエラー表示の見やすい工夫
エラーメッセージは赤文字などで表示すると、ユーザーにとって分かりやすくなります。Bootstrapのクラスを使うと簡単に装飾できます。
<div class="mb-3">
{{ form.name.label_tag }}
{{ form.name }}
{% if form.name.errors %}
<div class="text-danger">
{{ form.name.errors }}
</div>
{% endif %}
</div>
このように条件分岐を使うことで、エラーがあるときだけ表示できます。
6. 独自バリデーションエラーを追加する
Djangoでは、自分でルールを追加することもできます。例えば、年齢が0未満の場合にエラーを出したいときは、cleanメソッドを使います。
class ContactForm(forms.Form):
age = forms.IntegerField(label="年齢")
def clean_age(self):
age = self.cleaned_data["age"]
if age < 0:
raise forms.ValidationError("年齢は0以上で入力してください")
return age
このように書くことで、条件に合わない入力を防ぎ、分かりやすいメッセージを表示できます。
7. バリデーションエラーが表示される流れを整理
Djangoフォームでエラーが表示される流れはとてもシンプルです。フォームに入力された内容を受け取り、is_validでチェックし、エラーがあればテンプレートに渡されます。
テンプレート側では、errorsを表示するだけで、自動的に適切なメッセージが画面に出ます。初心者の方は「チェックはDjangoがやってくれる」と覚えると理解しやすくなります。