Я сделал, чтобы Django сформировался с почтовым полем и именем пользователя. Я хочу проверить электронную почту, уже не используется пользователем:
def clean_email(self):
email = self.cleaned_data["email"]
if User.objects.filter(email=email).count() != 0:
raise forms.ValidationError(_("Email not available."))
return email
Это работает, но повышает некоторые ложные отрицательные стороны, потому что электронная почта могла бы уже быть в базе данных для пользователя, названного в форме. Я хочу измениться на это:
def clean_email(self):
email = self.cleaned_data["email"]
username = self.cleaned_data["username"]
if User.objects.filter(email=email, username__ne=username).count() != 0:
raise forms.ValidationError(_("Email not available."))
return email
В документах Django говорится, что вся проверка для одного поля сделана прежде, чем перейти на следующее поле. Если электронная почта убрана перед именем пользователя, то cleaned_data["username"]
не будет доступно в clean_email
. Но документы неясны, относительно какого порядка поля убраны в. Я объявляю имя пользователя перед электронной почтой в форме, которая означает, что я в безопасности в предположении, что имя пользователя убрано перед электронной почтой?
Я мог прочитать код, но я больше интересуюсь тем, что API Django обещает и знает, что я в безопасности даже в будущих версиях Django.
В документации Django утверждается, что это в порядке определения поля.
Но я обнаружил, что это не всегда соответствует этому обещанию. Источник: http://docs.djangoproject.com/en/dev/ref/forms/validation/
Эти методы запускаются в следующем порядке данные выше, по одному полю за раз. Тот есть, для каждого поля в форме (в порядок их декларирования в форме определение), метод Field.clean () (или его переопределение), затем чистый_(). Наконец, однажды эти два метода запускаются для каждого поле, метод Form.clean () или его переопределение, выполняется.
Нет никаких обещаний, что поля будут обрабатываться в каком-либо определенном порядке. Официальная рекомендация состоит в том, что любая проверка, которая зависит от более чем одного поля, должна выполняться в методе формы clean ()
, а не в методах clean_foo ()
для конкретных полей.