DjangoのFormのバリデーションの使用方法
DjangoのFormでは、バリデーション機能を用いることができる。バリデーションとは、Formの値の型などが正しいかどうかチェックをして誤っていた場合、Form送信後の処理の実行を中止する機能のことを言う。
form.is_valid()で実行する。
django.form.Formを継承したフォームのクラス内でバリデーションを定義する。
バリデーションを設定する方法には、以下の3つの方法がある。
- django.core.validatorsをインポートして、パラメータの中にバリデーションを指定する。
- clean_という名前のメソッドをFormクラスの中に作成する
- バリデーション用の関数を作成して、パラメータの中で呼び出すように定義する
以下、それぞれの使い方を記述した。
- フォームのパラメータの中に指定する方法
from django.core import validators # validatorのインポート
def check_for_z(value):
if value[0].lower() != 'z':
raise forms.ValidationError("NEEDS TO START WITH Z")
class FormName(forms.Form):
name = forms.CharField()
email = forms.EmailField()
text = forms.CharField(widget=forms.Textarea)
botcatcher = forms.CharField(required=False,
widget=forms.HiddenInput,
validators=[validators.MaxLengthValidator(10)])
# validators=[validators.MaxLengthValidator(10)]として
# botcatcherは最大の長さは10とし。10以上の値が挿入されると画面上にエラーが発生、Formを送ることができない
- clean_メソッドで定義する
from django.core import validators
class FormName(forms.Form):
name = forms.CharField()
email = forms.EmailField()
verify_email = forms.EmailField(label='Enter your email again')
text = forms.CharField(widget=forms.Textarea)
botcatcher = forms.CharField(required=False,
widget=forms.HiddenInput,
validators=[validators.MaxLengthValidator(0)])
def clean_botcatcher(self):
# clean_botcatcherとしてForm送信時にbotcatcherの値が正しいか確認
# 例の場合、botcatcherの長さが0以上の場合はエラー
botcatcher = self.cleaned_data['botcatcher']
if len(botcatcher) > 0:
raise forms.ValidationError("GOTCHA BOT")
return botcatcher
def clean(self):
# clean()で関数を定義すると、Form送信時にすべてのformのパラメータをチェック
# 例では、emailとvmailが正しい場合はエラーが発生する
all_clean_data = super().clean()
email = all_clean_data['email']
vmail = all_clean_data['verify_email']
if email != vmail: # emailとverify_emailが等しくない場合ValidationError
raise forms.ValidationError("MAKE SURE EMAIL MATCH")
- 関数を作成して、validatorsで指定する
from django.core import validators
def check_for_z(value): # バリデーション用に定義した関数
if value[0].lower() != 'z':
raise forms.ValidationError("NEEDS TO START WITH Z") # バリデーションエラー
class FormName(forms.Form):
name = forms.CharField(validators=[check_for_z])
# validators=[check_for_z]としてバリデーションにcheck_for_z関数を指定する
# form送信時に、check_for_zが実行され、関数の引数valueにnameが渡される
email = forms.EmailField()
text = forms.CharField(widget=forms.Textarea)
botcatcher = forms.CharField(required=False,
widget=forms.HiddenInput)