Flask WTForms: разница между DataRequired и InputRequired

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

В моей форме регистрации есть несколько полей:

username
password 
password_repeat 
submit

Должны ли эти поля использовать валидатор DataRequired или InputRequired?


person Ryan    schedule 01.06.2014    source источник


Ответы (1)


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

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

Почему?

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

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

и

ПРИМЕЧАНИЕ этот валидатор раньше назывался Required, но его поведение (требующее принудительных данных, а не входных данных) означало, что он функционировал не симметрично валидатору Optional и, кроме того, вызывал путаницу с некоторыми полями. которые приводили данные к «ложным» значениям, таким как 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 - это ложное числовое значение 0.

person nsfyn55    schedule 01.06.2014