#環境
- 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