wtforms自定义验证器可以使字段可选吗?

时间:2011-12-09 12:13:27

标签: python flask wtforms

如果选中复选框,我正在使用自定义验证程序检查字段是否为空。它检查正确,但无论它是否总是在验证值是否为数字。

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

自定义验证器是否有办法停止对该字段的验证?

1 个答案:

答案 0 :(得分:13)

是的,自定义验证器可以像内置的Optional和Required验证器一样控制验证流程。要控制验证流程,请使用StopValidation例外,不再进行进一步验证。

如果通过消息引发StopValidation,它将被添加到错误列表中,否则如果没有消息,则不会再添加错误。

如果你正在使用IntegerField,FloatField等,你还必须记住输入强制时出现的“处理错误”。 Optional validator处理此方法的方式是,如果输入为空,它将清除所有先前的错误。让我们快速浏览一下wtforms / fields.py中的Optional validator代码:

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运行。