Djangoフォームでカスタムバリデーションを作成する手順を初心者向けに完全解説
生徒
「Djangoのフォームで、入力内容をチェックする仕組みがあると聞いたんですが、どういうものですか?」
先生
「Djangoにはバリデーションという仕組みがあり、フォームに入力された値が正しいかを自動で確認できます。」
生徒
「決まったチェックだけじゃなくて、自分で条件を作ることもできますか?」
先生
「できます。カスタムバリデーションを作ることで、独自のルールで入力チェックができます。」
生徒
「初心者でも理解できますか?」
先生
「大丈夫です。基本から順番に見ていきましょう。」
1. Djangoフォームとバリデーションの基本
Djangoのフォーム処理では、ユーザーが入力した値を安全に受け取るための仕組みが用意されています。その中でも重要なのがバリデーションです。バリデーションとは、入力内容が正しいかどうかを確認するチェック処理のことです。
例えば、年齢欄に文字が入力されていないか、メールアドレスの形式が正しいかなどを確認します。これを行わないと、間違ったデータが保存されてしまいます。
2. カスタムバリデーションとは何か
Djangoには最初から用意されたチェック機能がありますが、現実のアプリではそれだけでは足りないことがあります。そこで使うのがカスタムバリデーションです。
カスタムバリデーションとは、自分で条件を決めて入力内容を確認する方法です。たとえば「禁止ワードが含まれていないか」や「特定の文字数以上か」など、自由にルールを作れます。
3. フィールド単位のカスタムバリデーション
まずは、特定の入力欄だけをチェックする方法です。Djangoフォームでは、clean_フィールド名 というメソッドを作ることで、その項目専用のチェックができます。
from django import forms
class SampleForm(forms.Form):
age = forms.IntegerField(label="年齢")
def clean_age(self):
age = self.cleaned_data.get("age")
if age < 18:
raise forms.ValidationError("18歳未満の方は登録できません。")
return age
この例では、年齢が18未満の場合にエラーを出します。cleaned_dataとは、すでに基本チェックを通過した安全なデータのことです。
4. フォーム全体を使ったバリデーション
次に、複数の入力項目をまとめてチェックしたい場合です。この場合は clean メソッドを使います。
class LoginForm(forms.Form):
username = forms.CharField(label="ユーザー名")
password = forms.CharField(label="パスワード")
def clean(self):
cleaned_data = super().clean()
username = cleaned_data.get("username")
password = cleaned_data.get("password")
if username == password:
raise forms.ValidationError("ユーザー名とパスワードは同じにできません。")
return cleaned_data
この方法は、入力項目同士の関係をチェックしたいときに使います。
5. バリデーションエラーの表示仕組み
バリデーションでエラーが発生すると、フォームにエラーメッセージが自動で表示されます。テンプレートでは、以下のようにして表示できます。
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary">送信</button>
</form>
エラーがある場合、入力欄の近くに赤い文字でメッセージが表示されるため、利用者にも分かりやすい仕組みです。
6. 独自バリデーション関数の作成
同じチェックを複数のフォームで使いたい場合は、関数として切り出すことができます。
from django.core.exceptions import ValidationError
def no_admin_word(value):
if "admin" in value:
raise ValidationError("adminという文字は使用できません。")
class NameForm(forms.Form):
name = forms.CharField(
label="名前",
validators=[no_admin_word]
)
この方法を使うと、同じルールを何度も書かずに再利用できます。
7. 初心者がつまずきやすいポイント
カスタムバリデーションで多い失敗は、ValidationErrorを返さずに print してしまうことです。必ず例外としてエラーを出す必要があります。
また、cleanメソッドでは super().clean() を呼び出さないと、他のチェックが正しく動かなくなるため注意が必要です。
8. カスタムバリデーションを使う意味
カスタムバリデーションを使うことで、入力ミスを防ぎ、安全で使いやすいフォームを作ることができます。これはDjangoのフォーム処理においてとても重要な考え方です。
特に初心者のうちは、画面に表示されるエラーメッセージを意識して作ることで、利用者目線のプログラムが書けるようになります。