Я могу рассчитывать на порядок полевой проверки в форме Django?

Я сделал, чтобы 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.

9
задан Ned Batchelder 21 July 2010 в 13:01
поделиться

2 ответа

В документации Django утверждается, что это в порядке определения поля.

Но я обнаружил, что это не всегда соответствует этому обещанию. Источник: http://docs.djangoproject.com/en/dev/ref/forms/validation/

Эти методы запускаются в следующем порядке данные выше, по одному полю за раз. Тот есть, для каждого поля в форме (в порядок их декларирования в форме определение), метод Field.clean () (или его переопределение), затем чистый_(). Наконец, однажды эти два метода запускаются для каждого поле, метод Form.clean () или его переопределение, выполняется.

7
ответ дан 4 December 2019 в 08:32
поделиться

Нет никаких обещаний, что поля будут обрабатываться в каком-либо определенном порядке. Официальная рекомендация состоит в том, что любая проверка, которая зависит от более чем одного поля, должна выполняться в методе формы clean () , а не в методах clean_foo () для конкретных полей.

7
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: