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

Djangoフォームでカスタムバリデーションを作成する手順を初心者向けに完全解説

Djangoフォームでカスタムバリデーションを作成する手順
Djangoフォームでカスタムバリデーションを作成する手順

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

生徒

「Djangoのフォームで、入力内容をチェックする仕組みがあると聞いたんですが、どういうものですか?」

先生

「Djangoにはバリデーションという仕組みがあり、フォームに入力された値が正しいかを自動で確認できます。」

生徒

「決まったチェックだけじゃなくて、自分で条件を作ることもできますか?」

先生

「できます。カスタムバリデーションを作ることで、独自のルールで入力チェックができます。」

生徒

「初心者でも理解できますか?」

先生

「大丈夫です。基本から順番に見ていきましょう。」

1. Djangoフォームとバリデーションの基本

1. Djangoフォームとバリデーションの基本
1. Djangoフォームとバリデーションの基本

Djangoのフォーム処理では、ユーザーが入力した値を安全に受け取るための仕組みが用意されています。その中でも重要なのがバリデーションです。バリデーションとは、入力内容が正しいかどうかを確認するチェック処理のことです。

例えば、年齢欄に文字が入力されていないか、メールアドレスの形式が正しいかなどを確認します。これを行わないと、間違ったデータが保存されてしまいます。

2. カスタムバリデーションとは何か

2. カスタムバリデーションとは何か
2. カスタムバリデーションとは何か

Djangoには最初から用意されたチェック機能がありますが、現実のアプリではそれだけでは足りないことがあります。そこで使うのがカスタムバリデーションです。

カスタムバリデーションとは、自分で条件を決めて入力内容を確認する方法です。たとえば「禁止ワードが含まれていないか」や「特定の文字数以上か」など、自由にルールを作れます。

3. フィールド単位のカスタムバリデーション

3. フィールド単位のカスタムバリデーション
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. フォーム全体を使ったバリデーション

4. フォーム全体を使ったバリデーション
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. バリデーションエラーの表示仕組み

5. バリデーションエラーの表示仕組み
5. バリデーションエラーの表示仕組み

バリデーションでエラーが発生すると、フォームにエラーメッセージが自動で表示されます。テンプレートでは、以下のようにして表示できます。


<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">送信</button>
</form>

エラーがある場合、入力欄の近くに赤い文字でメッセージが表示されるため、利用者にも分かりやすい仕組みです。

6. 独自バリデーション関数の作成

6. 独自バリデーション関数の作成
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. 初心者がつまずきやすいポイント

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

カスタムバリデーションで多い失敗は、ValidationErrorを返さずに print してしまうことです。必ず例外としてエラーを出す必要があります。

また、cleanメソッドでは super().clean() を呼び出さないと、他のチェックが正しく動かなくなるため注意が必要です。

8. カスタムバリデーションを使う意味

8. カスタムバリデーションを使う意味
8. カスタムバリデーションを使う意味

カスタムバリデーションを使うことで、入力ミスを防ぎ、安全で使いやすいフォームを作ることができます。これはDjangoのフォーム処理においてとても重要な考え方です。

特に初心者のうちは、画面に表示されるエラーメッセージを意識して作ることで、利用者目線のプログラムが書けるようになります。

カテゴリの一覧へ
新着記事
New1
Django
Djangoバリデーション完全入門|cleanメソッドで学ぶカスタムチェックの書き方【初心者向け】
New2
Flask
FlaskとAWS S3を連携!静的ファイルを効率よく配信する初心者向け完全ガイド
New3
Python
Pythonで例外の種類ごとに処理を分ける方法を完全解説!初心者でもわかる複数except入門
New4
Python
Pythonでリストの要素を検索・取得する方法!index()やin演算子の活用法
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.4
Java&Spring記事人気No4
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.5
Java&Spring記事人気No5
Python
Pythonのコーディング規約(PEP8)とは?初心者でもわかる書き方の基本ルール
No.6
Java&Spring記事人気No6
Python
Pythonで空白や不要な文字を削除する方法!strip(), rstrip(), lstrip() の使い方を初心者向けに解説
No.7
Java&Spring記事人気No7
Flask
Flaskでフロントエンドからファイルアップロードを行う基本手順【初心者向け】
No.8
Java&Spring記事人気No8
Flask
Flaskでデータベースエラーを処理する方法!初心者にもわかる例外の使い方