【问题标题】:Can wtforms custom validator make a field optional?wtforms 自定义验证器可以使字段可选吗?
【发布时间】:2012-01-16 17:40:01
【问题描述】:

如果选中复选框,我正在使用自定义验证器来检查字段是否为空。它检查正确,但无论如何它仍然始终验证该值是否为数字。

基本上我需要一个字段来在表单的某些条件下停止验证。

自定义验证器有没有办法停止现场验证?

【问题讨论】:

标签: python flask wtforms


【解决方案1】:

是的,自定义验证器可以控制验证流程,就像内置的可选和必需验证器一样。要控制验证流程,请使用StopValidation 异常,不会进行进一步验证。

如果 StopValidation 带有消息,它将被添加到错误列表中,否则如果没有消息,则不会添加更多错误。

如果您使用 IntegerField、FloatField 等。您还必须记住在输入强制时发生的“处理错误”。 Optional 验证器处理此问题的方式是,如果输入为空,它会清除所有先前的错误。让我们快速浏览一下来自 wtforms/fields.py 的 Optional 验证器的代码:

if not field.raw_data or isinstance(field.raw_data[0], basestring) and not field.raw_data[0].strip():
    field.errors[:] = []
    raise StopValidation()

正如您所看到的,如果没有输入或空白输入,它会做的事情之一是清除之前的任何错误。

那么,让我们来看看如何做您的自定义验证器。

from wtforms.validators import StopValidation

def myvalidator(form, field):
    if not form.some_checkbox_field.data:
        # clear out processing errors
        field.errors[:] = []
        # Stop further validators running
        raise StopValidation()

然后你可以像这样使用你的验证器:

from wtforms import BooleanField, IntegerField, Form, validators as v

class SomeForm(Form):
    some_checkbox_field = BooleanField('Enable MyNumber')
    mynumber = IntegerField('', [myvalidator, v.NumberRange(min=5, max=50)])

因此,如果选中该复选框,它将验证 mynumber 是否为输入的数字。此外,将运行 NumberRange 验证器。如果未选中,错误将被清除,StopValidation 将阻止 NumberRange 运行。

【讨论】:

猜你喜欢
  • 2015-01-20
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多