カテゴリ: Django 更新日: 2026/02/18

Djangoバリデーション完全入門|cleanメソッドで学ぶカスタムチェックの書き方【初心者向け】

Djangoバリデーションでcleanメソッドを使ったカスタムチェックの書き方
Djangoバリデーションでcleanメソッドを使ったカスタムチェックの書き方

先生と生徒の会話形式で理解しよう

生徒

「Djangoで入力チェックってどうやるんですか?フォームに変な文字を入れられたら困ります…」

先生

「Djangoにはバリデーションという仕組みがあって、入力内容を確認できます。その中でもcleanメソッドを使うと、自分でルールを作れますよ。」

生徒

「自分でルールを作るって難しそうです…」

先生

「大丈夫です。パソコンを触ったことがない人でもイメージできるように、順番に説明します。」

1. Djangoのバリデーションとは?

1. Djangoのバリデーションとは?
1. Djangoのバリデーションとは?

Djangoのバリデーションとは、フォームに入力された内容が「正しいかどうか」を確認する仕組みです。たとえば、年齢の欄に文字が入っていたり、空欄のまま送信されたら困りますよね。

これは、レジでお金を払う前に店員さんが金額を確認するのと同じです。Djangoは、データを保存する前に「本当に大丈夫?」とチェックしてくれます。

この入力チェックをしないと、データベース(情報を保存する箱)におかしなデータが入ってしまいます。

2. cleanメソッドって何をするもの?

2. cleanメソッドって何をするもの?
2. cleanメソッドって何をするもの?

cleanメソッドは、Djangoフォームで使われる特別な関数です。関数とは「決まった処理をまとめたもの」です。

cleanメソッドは、フォームに入力されたすべての値をまとめてチェックしたいときに使います。個別ではなく、全体を見るイメージです。

たとえるなら、テストの名前欄と点数欄を両方見て「名前があって、点数も0〜100の間か」を確認する先生のような役割です。

3. Djangoフォームの基本構造を知ろう

3. Djangoフォームの基本構造を知ろう
3. Djangoフォームの基本構造を知ろう

まずは、Djangoフォームの形を見てみましょう。これは入力画面を作るための設計図です。


from django import forms

class SampleForm(forms.Form):
    name = forms.CharField(label="名前")
    age = forms.IntegerField(label="年齢")

CharFieldは文字、IntegerFieldは数字を入力するための部品です。Djangoが自動で「数字じゃないとダメですよ」とチェックしてくれます。

4. cleanメソッドを使ったカスタムチェック

4. cleanメソッドを使ったカスタムチェック
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って何?

5. ValidationErrorって何?
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. 複数の項目をまとめてチェックする理由

6. 複数の項目をまとめてチェックする理由
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メソッドが動くタイミング

7. cleanメソッドが動くタイミング
7. cleanメソッドが動くタイミング

cleanメソッドは、フォームが送信されたあと、自動で実行されます。

ボタンを押した瞬間に、Djangoが中身を全部チェックしてくれる流れです。

自分で呼び出す必要はありません。Djangoが裏で働いてくれます。

8. 初心者がつまずきやすいポイント

8. 初心者がつまずきやすいポイント
8. 初心者がつまずきやすいポイント

よくある間違いは、return cleaned_dataを書き忘れることです。

これは、チェック後のデータをDjangoに返す大事な一文です。


def clean(self):
    cleaned_data = super().clean()
    # チェック処理
    return cleaned_data

これを書かないと、正しく動かなくなります。

カテゴリの一覧へ
新着記事
New1
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
New2
Python
Pythonで文字列の長さを取得する方法!len()の基本と応用テクニック
New3
Python
Pythonのリストをソート(並び替え)する方法!sort()とsorted()の違いと使い方
New4
Flask
FlaskアプリでCORS設定をセキュアに行う方法を解説!初心者向けにやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.2
Java&Spring記事人気No2
Flask
PythonのFlaskで言語を自動判別!ユーザーに合わせた表示切り替えの仕組みを徹底解説
No.3
Java&Spring記事人気No3
Flask
PythonのFlaskでURLに言語コードを含める方法!多言語ルーティングの実装ガイド
No.4
Java&Spring記事人気No4
Python
Pythonの文字列から一部を抽出する方法!スライスを使った基本的な切り出し方
No.5
Java&Spring記事人気No5
Python
Pythonの変数宣言と型ヒントの使い方!初心者向けに基礎をやさしく解説
No.6
Java&Spring記事人気No6
Python
Pythonの関数を使ったカスタムソート(keyパラメータ)をわかりやすく解説!初心者でも使える並べ替えテクニック
No.7
Java&Spring記事人気No7
Python
Pythonのリストに要素を追加・削除する方法!append, remove, popの使い分けを解説
No.8
Java&Spring記事人気No8
Python
Pythonのリストを分割する方法を完全ガイド!初心者でもわかるスライス・split・itertoolsの使い方