В чем разница между 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
.