DataRequired
InputRequired
和wtforms.valiadators
之间有何区别?
我的注册表单中有一些字段:
username
password
password_repeat
submit
这些字段是否应使用DataRequired
或InputRequired
验证程序?
答案 0 :(得分:30)
除非您有充分的理由,否则应使用InputRequired
让我们看一下文档/代码中的一些注释:
请注意,这与DataRequired有区别,因为InputRequired看起来提供了表单输入数据,DataRequired查看了强制后数据。
和
注意这个验证器过去被称为
Required
,但它的行为方式(需要强制数据,而不是输入数据)意味着它的运行方式与{{{ 1}}验证器,并进一步导致与某些字段混淆,这些字段强制数据为'falsey'值,如Optional
,0
,Decimal(0)
等。除非存在非常具体的原因,否则我们建议使用:class:time(0)
代替。
这是什么意思?
在InputRequired
课程中,您会注意到两个关键字参数Form
和formdata
。这些通常与两种方法data
和process
相对应。当表单数据通过线路进入时,它并不总是采用与process_formdata
类型对应的格式。一个很好的例子是提供给Field
的值u'1'
。如果你有一个IntegerField
验证工具,那将是个坏消息,因为NumberRange
不是一个数字。
u'1'
方法的主要目的是通过在运行验证规则之前将值强制转换为正确的类型来防止出现这种情况。当他们说“查看后强制数据”
问题!
process_formdata
和InputRequired
的工作方式与DataRequired
实施方式相同:
__call__
某些字段类型将数据强制转换为 Falsey 值(0,十进制(0)等)。当您拥有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
并且表单提交类似IntegerField
的值时,会出现此问题。如果您将'0'
应用于此,则验证将失败。这是因为DataRequired
将在强制执行后评估DataRequired
if not field.data...
是 Falsey 数值field.data
。