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()
     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

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

Django フォーム

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

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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門