Python 入門

ホーム > Django のフォームライブラリ > Django フォームのバリデーション (入力検証)

Django フォームのバリデーション (入力検証)

ここでは、入力検証についてみていきましょう。

「Django フォームの基本」 で作成した次のフォームからはじめましょう。

from django import forms

class KakikomiForm(forms.Form):
     name = forms.CharField()
     email = forms.EmailField()
     body = forms.CharField(widget=forms.Textarea)

Django フォーム

上のコードのまま、サブミットするとどのようになるか確認します。 何も入力せずにフォームをサブミットすると、デフォルトでは全て必須入力項目 (required=True) ですから、入力を促すエラーメッセージが表示されます。

Django フォーム

入力項目を必須項目ではなく、任意の入力項目にするには、次のように required=False とします。

from django import forms

class KakikomiForm(forms.Form):
     name = forms.CharField(required=False)
     email = forms.EmailField(required=False)
     body = forms.CharField(required=False, widget=forms.Textarea)

CharField で最大長を指定するには、次のように max_length を指定します。

     name = forms.CharField(required=False, max_length=20)

カスタムの入力検証

Django のフォームシステムでは、デフォルトの入力検証が終わった後に、clean_ から始まり、 フィールド名のついたメソッドを呼出します。この clean_* メソッドによって、カスタムの入力検証を行うことができます。 例えば、email というフィールドに対しては、clean_email というメソッド名で入力検証を行います。

例えば次のように、body フィールドの入力検証用のメソッド (clean_body) を定義します。

from django import forms

class KakikomiForm(forms.Form):
     name = forms.CharField(required=False, max_length=20)
     email = forms.EmailField(required=False)
     body = forms.CharField(required=False, 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

この結果、次のようにエラーが表示されました。

Django フォーム

尚、上の例でわかるようにデフォルトの入力検証を通ったクリーンなデータは、self.cleaned_data でアクセス可能です。

self.cleaned_data のデータに対して入力検証を行い、検証が失敗した場合、 ValidationError を投げます。検証を通った場合は、return でクリーンなデータを返します。

ホーム > Django のフォームライブラリ > Django フォームのバリデーション (入力検証)