Я пытаюсь перенести все проверки, связанные с бизнес-логикой, в модели, а не оставлять их в формах. Но здесь у меня есть каверзная ситуация, по поводу которой я люблю консультироваться с сообществом SO.
В моей SignupForm (образцовая форма) у меня есть следующая проверка для конкретного поля, чтобы убедиться, что входной адрес электронной почты еще не существует.
def clean_email(self):
email = self.cleaned_data['email']
if ExtendedUser.objects.filter(email=email).exists():
raise ValidationError('This email address already exists.')
return email
Если бы я перенес эту проверку на модели, согласно официальному документу, я бы поместил ее в clean()
соответствующей модели, ExtendedUser
. Но документ также упоминает следующее:
Любые исключения ValidationError, вызванные Model.clean(), будут храниться в специальном ключе словаря ошибок NON_FIELD_ERRORS, который используется для ошибок, связанных со всей моделью, а не с конкретным полем.
Это означает, что с clean()
я не могу связать возникающие из него ошибки с конкретными полями. Мне было интересно, предлагают ли модели что-то похожее на формы clean_<fieldname>()
. Если нет, то где бы вы разместили эту логику проверки и почему?