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