Подтвердить что ты не робот

Флакон WTForms: разница между DataRequired и InputRequired

В чем разница между DataRequired и InputRequired в wtforms.valiadators

У меня есть поля в моей регистрационной форме:

username
password 
password_repeat 
submit

Если эти поля используют валидатор DataRequired или InputRequired?

4b9b3361

Ответ 1

Краткий ответ

Если у вас нет веских оснований, вы должны использовать InputRequired

Почему?

Давайте рассмотрим некоторые примечания из документа/кода:

Обратите внимание, что существует различие между этим и DataRequired в том, что InputRequired показывает, что данные ввода формы были предоставлены, а DataRequired просматривает данные после принуждения.

и

ПРИМЕЧАНИЕ этот валидатор обычно назывался Required, но способ, которым он вел себя (требующий принудительных данных, а не входные данные), означал, что он функционирует таким образом, который не был симметричен валидатору Optional и, кроме того, вызвало путаницу с определенными полями, которые принуждали данные к значениям "false", таким как 0, Decimal(0), time(0) и т.д. Если не существует очень конкретной причины, мы рекомендуем вместо этого использовать: class: InputRequired.

Что это значит?

В классе Form вы увидите два аргумента ключевых слов formdata и data. Они обычно соответствуют двум методам process и process_formdata. Когда данные формы выводятся из провода, он не всегда находится в формате, соответствующем типу Field. Хорошим примером этого является то, что значение u'1' подается на IntegerField. Это было бы плохой новостью, если бы у вас был валидатор NumberRange, потому что u'1' не является числом.

Основной целью метода process_formdata является предотвращение этой ситуации путем принудительного ввода значения в правильный тип до запуска правил проверки. Это то, о чем они говорят, когда говорят "смотрит на данные после принуждения"

проблема!

Оба InputRequired и DataRequired работают точно так же, как реализация __call__:

def __call__(self, form, field):
    if not field.data or isinstance(field.data, string_types) and not field.data.strip():
        if self.message is None:
            message = field.gettext('This field is required.')
        else:
            message = self.message

Определенные типы полей введут данные в значения Falsey (0, Decimal (0) и т.д.). Проблема возникает, если у вас есть IntegerField, и форма отправляет значение, подобное '0'. Если вы примените DataRequired к этому, это приведет к отказу проверки. Это связано с тем, что DataRequired будет оценивать if not field.data... после принуждения, где field.data - числовое значение Falsey 0.