Djangoバリデーション完全入門|cleanメソッドで学ぶカスタムチェックの書き方【初心者向け】
生徒
「Djangoで入力チェックってどうやるんですか?フォームに変な文字を入れられたら困ります…」
先生
「Djangoにはバリデーションという仕組みがあって、入力内容を確認できます。その中でもcleanメソッドを使うと、自分でルールを作れますよ。」
生徒
「自分でルールを作るって難しそうです…」
先生
「大丈夫です。パソコンを触ったことがない人でもイメージできるように、順番に説明します。」
1. Djangoのバリデーションとは?
Djangoのバリデーションとは、フォームに入力された内容が「正しいかどうか」を確認する仕組みです。たとえば、年齢の欄に文字が入っていたり、空欄のまま送信されたら困りますよね。
これは、レジでお金を払う前に店員さんが金額を確認するのと同じです。Djangoは、データを保存する前に「本当に大丈夫?」とチェックしてくれます。
この入力チェックをしないと、データベース(情報を保存する箱)におかしなデータが入ってしまいます。
2. cleanメソッドって何をするもの?
cleanメソッドは、Djangoフォームで使われる特別な関数です。関数とは「決まった処理をまとめたもの」です。
cleanメソッドは、フォームに入力されたすべての値をまとめてチェックしたいときに使います。個別ではなく、全体を見るイメージです。
たとえるなら、テストの名前欄と点数欄を両方見て「名前があって、点数も0〜100の間か」を確認する先生のような役割です。
3. Djangoフォームの基本構造を知ろう
まずは、Djangoフォームの形を見てみましょう。これは入力画面を作るための設計図です。
from django import forms
class SampleForm(forms.Form):
name = forms.CharField(label="名前")
age = forms.IntegerField(label="年齢")
CharFieldは文字、IntegerFieldは数字を入力するための部品です。Djangoが自動で「数字じゃないとダメですよ」とチェックしてくれます。
4. cleanメソッドを使ったカスタムチェック
ここからが本題です。cleanメソッドを使うと、自分で細かいルールを決められます。
class SampleForm(forms.Form):
name = forms.CharField(label="名前")
age = forms.IntegerField(label="年齢")
def clean(self):
cleaned_data = super().clean()
age = cleaned_data.get("age")
if age is not None and age < 20:
raise forms.ValidationError("20歳未満の方は登録できません。")
return cleaned_data
raiseは「エラーを出す」という意味です。ここでは、20歳未満ならエラーメッセージを表示します。
5. ValidationErrorって何?
ValidationErrorは「入力内容がルールに合っていません」という合図です。
これは、信号機の赤信号のようなものです。進もうとすると止められます。
from django.core.exceptions import ValidationError
def clean(self):
cleaned_data = super().clean()
name = cleaned_data.get("name")
if name == "admin":
raise ValidationError("この名前は使えません。")
このように、特定の文字を禁止することもできます。
6. 複数の項目をまとめてチェックする理由
cleanメソッドの強みは、複数の入力を一緒に見られることです。
たとえば、「未成年なのにお酒を選んでいる」など、組み合わせで判断したい場合に便利です。
class OrderForm(forms.Form):
age = forms.IntegerField()
drink = forms.CharField()
def clean(self):
cleaned_data = super().clean()
age = cleaned_data.get("age")
drink = cleaned_data.get("drink")
if age < 20 and drink == "alcohol":
raise forms.ValidationError("未成年はお酒を注文できません。")
7. cleanメソッドが動くタイミング
cleanメソッドは、フォームが送信されたあと、自動で実行されます。
ボタンを押した瞬間に、Djangoが中身を全部チェックしてくれる流れです。
自分で呼び出す必要はありません。Djangoが裏で働いてくれます。
8. 初心者がつまずきやすいポイント
よくある間違いは、return cleaned_dataを書き忘れることです。
これは、チェック後のデータをDjangoに返す大事な一文です。
def clean(self):
cleaned_data = super().clean()
# チェック処理
return cleaned_data
これを書かないと、正しく動かなくなります。