Django フォームのバリデーション (入力検証)
ここでは、入力検証についてみていきましょう。
「Django フォームの基本」 で作成した次のフォームからはじめましょう。
from django import forms
class KakikomiForm(forms.Form):
name = forms.CharField()
email = forms.EmailField()
body = forms.CharField(widget=forms.Textarea)
上のコードのまま、サブミットするとどのようになるか確認します。 何も入力せずにフォームをサブミットすると、デフォルトでは全て必須入力項目 (required=True) ですから、入力を促すエラーメッセージが表示されます。
入力項目を必須項目ではなく、任意の入力項目にするには、次のように required=False とします。
from django import forms
class KakikomiForm(forms.Form):
name = forms.CharField()
email = forms.EmailField(required=False)
body = forms.CharField(widget=forms.Textarea)
CharField で最大長を指定するには、次のように max_length を指定します。
name = forms.CharField(max_length=30)
カスタムの入力検証
Django のフォームシステムでは、デフォルトの入力検証が終わった後に、clean_ から始まり、 フィールド名のついたメソッドを呼出します。この clean_* メソッドによって、カスタムの入力検証を行うことができます。 例えば、email というフィールドに対しては、clean_email というメソッド名で入力検証を行います。
例えば次のように、body フィールドの入力検証用のメソッド (clean_body) を定義します。
from django import forms
class KakikomiForm(forms.Form):
name = forms.CharField(max_length=30)
email = forms.EmailField(required=False)
body = forms.CharField(widget=forms.Textarea)
def clean_body(self):
body = self.cleaned_data['body']
if(body.find('<') != -1 or body.find('>') != -1):
raise forms.ValidationError("Tags are not allowed.")
return body
この結果、次のようにエラーが表示されました。
尚、上の例でわかるようにデフォルトの入力検証を通ったクリーンなデータは、self.cleaned_data でアクセス可能です。
self.cleaned_data のデータに対して入力検証を行い、検証が失敗した場合、 ValidationError を投げます。検証を通った場合は、return でクリーンなデータを返します。