Flask WTForms:DataRequired和InputRequired之间的区别

时间:2014-06-01 18:13:47

标签: python flask wtforms flask-wtforms

DataRequired

InputRequiredwtforms.valiadators之间有何区别?

我的注册表单中有一些字段:

username
password 
password_repeat 
submit

这些字段是否应使用DataRequiredInputRequired验证程序?

1 个答案:

答案 0 :(得分:30)

简答

除非您有充分的理由,否则应使用InputRequired

为什么?

让我们看一下文档/代码中的一些注释:

  

请注意,这与DataRequired有区别,因为InputRequired看起来提供了表单输入数据,DataRequired查看了强制后数据。

  

注意这个验证器过去被称为Required,但它的行为方式(需要强制数据,而不是输入数据)意味着它的运行方式与{{{ 1}}验证器,并进一步导致与某些字段混淆,这些字段强制数据为'falsey'值,如Optional0Decimal(0)等。除非存在非常具体的原因,否则我们建议使用:class:time(0)代替。

这是什么意思?

InputRequired课程中,您会注意到两个关键字参数Formformdata。这些通常与两种方法dataprocess相对应。当表单数据通过线路进入时,它并不总是采用与process_formdata类型对应的格式。一个很好的例子是提供给Field的值u'1'。如果你有一个IntegerField验证工具,那将是个坏消息,因为NumberRange不是一个数字。

u'1'方法的主要目的是通过在运行验证规则之前将值强制转换为正确的类型来防止出现这种情况。当他们说“查看后强制数据”

时,他们所指的就是这些

问题!

process_formdataInputRequired的工作方式与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