В чем разница между DataRequired и InputRequired в wtforms.valiadators
У меня есть поля в моей регистрационной форме:
username
password
password_repeat
submit
Если эти поля используют валидатор DataRequired или InputRequired?
В чем разница между DataRequired и InputRequired в wtforms.valiadators
У меня есть поля в моей регистрационной форме:
username
password
password_repeat
submit
Если эти поля используют валидатор DataRequired или InputRequired?
Если у вас нет веских оснований, вы должны использовать 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.