LoginSignup
1

More than 5 years have passed since last update.

Djangoのforms.pyでメソッドを使ったフォームのバリデーション

Posted at

環境

  • Django2.1

特定のカラムに対してバリデーションする

特定のカラムに対してバリデーションするメソッド名の命名規則はclean_<fieldname>() となる。
したがって、slugカラムについてのバリデーションする場合のメソッド名はclean_slug()となる。

forms.py
from django.forms import ModelForm, ValidationError


class NewsForm(ModelForm):
    class Meta:
        model = News
        fields = ('title', 'slug')

    def clean_slug(self):
        slug = self.cleaned_data['slug']
        existing = News.objects.filter(
            slug=slug
        ).exists()
        if existing:
            raise ValidationError({
                'symbol': ['このスラッグはすでに登録されています。']
            })
        return slug

特定のフィールド属性をクリーニングする

複数のカラムにまたがってバリデーションする

clean()で複数のカラム(フィールド)によるバリデーションが可能である。
clean()は特定のカラムに対してバリデーションが実行された後に実行される。

フォームの clean() メソッドが呼び出されるまでに、個別のフィールドのクリーンメソッドが呼び出されているので (上記 2 つのセクションで見た通りです)、self.cleaned_data にはこれまでのクリーニングで生き残ったデータが格納されています。したがって、検証しようとしているフィールドが、この個別フィールドのチェックを生き残っていない可能性を考慮する必要があります。

forms.py
from django.forms import ModelForm, ValidationError


class NewsForm(ModelForm):
    class Meta:
        model = News
        fields = ('title', 'slug')

    def clean(self):
        cleaned_data = super(PersonForm, self).clean()

        existing = News.objects.filter(
            ...
        ).exists()
        if existing:
            raise ValidationError({
                'symbol': ['登録済みです。']
            })
        return cleaned_data

互いに依存するフィールドをクリーニングして検証する

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1