Skip to content

バリデーション

Djangoでは、データの整合性と品質を確保するために、複数のレベルでバリデーションを実施します。これにより、無効なデータがデータベースに保存されるのを防ぎます。

1. フィールドレベルのバリデーション

Section titled “1. フィールドレベルのバリデーション”

モデルのフィールドを定義する際、引数として最も基本的なバリデーションルールを指定できます。これは、Djangoのモデルシステムに組み込まれており、開発者がコードをほとんど書くことなく利用できます。

  • max_length: CharFieldTextFieldなどの文字列フィールドに適用され、入力可能な最大文字数を制限します。

    name = models.CharField(max_length=100) # 名前は100文字以内
  • unique=True: このフィールドの値がデータベース全体で一意であることを保証します。同じ値を持つレコードが複数存在することは許されません。

    email = models.EmailField(unique=True) # メールアドレスは一意
  • null=False, blank=False: null=FalseはデータベースレベルでNULL値が許可されないことを意味し、blank=Falseはフォームで空欄が許可されないことを意味します。これにより、フィールドが必須項目であることを強制できます。

    title = models.CharField(max_length=200, blank=False) # タイトルは必須項目

2. モデルレベルのバリデーション

Section titled “2. モデルレベルのバリデーション”

特定のフィールドだけでなく、複数のフィールドにまたがる複雑なバリデーションルールを適用したい場合、**clean()**メソッドを使います。このメソッドは、forms.ModelFormや管理画面でデータを保存する直前に呼び出されます。

from django.core.exceptions import ValidationError
from django.db import models
class Event(models.Model):
start_date = models.DateField()
end_date = models.DateField()
def clean(self):
# 終了日が開始日より前ではないかを確認
if self.end_date < self.start_date:
raise ValidationError('End date cannot be before start date.')

この例では、clean()メソッド内でstart_dateend_dateの値を比較し、無効な場合はValidationErrorを発生させています。

Djangoのバリデーションは、様々なシナリオでデータの品質を保つために利用されます。

  • ユーザー登録: ユーザー登録フォームで、メールアドレスが既に登録されていないか(unique=True)、パスワードが一定の長さ以上か、あるいはパスワードとパスワード確認が一致するか(clean()メソッドで確認)を検証します。

  • イベント管理: イベントの開始日と終了日が正しく設定されているか(前述のclean()メソッドの例)、予約人数が最大定員を超えていないかを検証します。

  • オンラインストア: 商品の在庫数が負の値にならないように検証したり、価格が0より大きいことを確認したりします。

  • ブログ記事: 記事のタイトルや本文が空でないこと、あるいは特定の文字数制限を超えていないことを検証します。

フォームレベルのバリデーション

Section titled “フォームレベルのバリデーション”

Djangoには、モデルだけでなく、フォームにもバリデーションを追加する仕組みがあります。これは、ユーザーからの入力データを処理する際に特に重要です。フォームのバリデーションは、モデルに保存する前の段階でエラーをキャッチするため、より効率的なユーザーエクスペリエンスを提供できます。

forms.Formforms.ModelForm を使用してフォームを定義し、フィールドごとのバリデーション(例:clean_field_name)やフォーム全体のバリデーション(cleanメソッド)を実装できます。

この段階でエラーを検出すると、ユーザーに即座にフィードバックを返すことができます。たとえば、「パスワードが短すぎます」といったメッセージをフォームの横に表示することが可能です。

clean()メソッドは、必ずしも自動で実行されるわけではありません。

  • Model.full_clean(): モデルのインスタンスを手動で保存する前に、すべてのバリデーションルール(フィールドおよびclean()メソッド)を実行したい場合は、full_clean()メソッドを呼び出す必要があります。

  • ModelForm: Djangoの管理画面や、ModelFormクラスを通じてデータを保存する場合、これらのバリデーションは自動的に呼び出されます。

Djangoのバリデーションシステムは、開発者がデータの整合性を複数の段階で確保できるように設計されており、柔軟性が高いのが特徴です。