Django バリデーション設定の基本 [validation]

2019年11月12日

Djangoにおけるバリデーション設定の基本を説明します。

 

なおFormクラスおよびModelFormクラスを利用した基本的なフォーム画面作成の手順は本記事では説明しませんので、下記の関連ページをご覧下さい。またuserアプリケーションおよびnew.htmlテンプレートが作成済であることを前提としています。

 

関連ページ

フォーム画面作成の基本 [Form]

 

モデルからフォーム画面を作成 [ModelForm]

 

 

バリデーションの設定概要


 

バリデーションの設定方法は大きく分けて以下のように分けられます。

 

・CharFieldなどの入力フィールドの属性(オプション)として設定する。

・clean_フィールド名()メソッド、clean()メソッドを利用する。

・独自の関数として用意する。

・django.core.validatorsモジュールのバリデーションを利用する。

 

 

以下FormクラスおよびModelFormクラスそれぞれのパターンに分けて具体的なコードで説明していきます。views.pyとnew.htmlテンプレートは共通のファイルで実行できます。

 

Formクラス


 

user/forms.py

11行目

requiredやmax_lengthは、入力フィールドの属性として設定するもっともシンプルなバリデーションです。フィールドはデフォルトではrequired=Trueが設定されており入力必須となっています。CharFieldやIntegerFieldなどの入力フィールドの種類によってバリデーションの属性の種類は若干変わってきます。各フィールドのバリデーションについては ビルトインの Field クラス をご参照下さい。また後述しますが、ModelFormではrequiredやmin_lengthなどは使えずdjango.core.validatorsモジュールのビルトインのバリデータ等を利用する必要があります。

 

21〜25行目

clean_フィールド名()メソッドで、そのフィールドに対してカスタマイズしたバリデーション処理を記述することができます。

 

27〜33行目

clean_フィールド名()メソッドは個別のフィールドごとの処理ですが、clean()メソッドでは複数のフィールドに対してバリデーションを設定することができます。このclean()によって出力されるエラーメッセージはテンプレートにおいて{{ form.as_p }}で出力させる場合、その中の要素の一番上に表示されます。

 

5〜7行目

独自のバリデーションの関数(上記ではcheck_ageという名前を付けた)を用意しています。上記ではclean_ageと同じ処理の関数を記述しています。ValidationErrorでバリデーションチェック時に意図的にエラーを出力するようにします。2行目においてValidationErrorをインポートしています。このバリデーションをフィールドに設定する場合は、19行目のコメントアウトした方を利用します。属性として、validators=[check_age]を設定しているのが確認できます。

 

 

 

ModelFormクラス


 

モデルからフォーム画面を作成しています。上述したFormクラスによる作成と用意しているフィールドの種類が違うことをご了承下さい。また様々なバリデーションによる設定を説明しているため若干統一性がないこともご了承下さい。

 

user/models.py

12行目

フォームフィールド型(forms.〜)と違いモデルフィールド型(models.〜)は、その属性に設定するバリデーションの種類は少ないです。(それら種類についてはフィールドの型をご参照下さい)。仮にここでmin_lengthや入力必須でないようにするrequired=Falseを記述するとエラーとなります。もしrequired=Falseを設定したい場合は、forms.py側に設定して下さい(後述)。

 

14/15行目

django.core.validatorsモジュールで用意されているバリデータをvalidators=[]に設定しています。2行目でインポートしていることに注意して下さい(それら種類についてはビルトインのバリデータをご参照下さい)。第1引数では条件、第2引数ではエラーメッセージを設定しています。

 

16行目

独自のバリデーションの関数(check_age)も設定できます。

 

 

 

user/forms.py

8〜10行目

nameフィールドを「required = False」に設定しています。これをmodels.py側のフィールドの属性に設定するとエラーとなります。

 

35〜39行目

コメントアウトしていますがclean_フィールド名()メソッド、もしくはclean()メソッドも利用できます。

 

 

 

views.pyとnew.htmlテンプレート


 

FormクラスおよびModelFormクラスによるフォーム画面の記述をしてきましたが、以下views.pyとnew.htmlテンプレートは共通のファイルで利用できます。

 

user/views.py

10行目

is_valid()でバリデーションのチェックをチェックをおこなっています。モデルからフォーム画面を作成した場合は、次の行にform.save()を記述するとデータベースにフォームに入力された値を保存できます。

 

user/templates/user/new.html

 

 

参照ページ


 

django ドキュメント

フォームとフィールドの検証

 

django.core.validators のソースコード

 

バリデータ

 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー