Python wtforms自定义验证器能否将字段设置为可选字段?

Python wtforms自定义验证器能否将字段设置为可选字段?,python,flask,wtforms,Python,Flask,Wtforms,如果选中复选框,我将使用自定义验证器检查字段是否为空。它检查正确,但不管如何,它始终会验证值是否为数字 基本上,我需要一个字段在表单的某些条件下停止验证 自定义验证器是否有方法停止现场验证 是的,自定义验证器可以像内置可选和必需的验证器一样控制验证流。要控制验证流,请使用StopValidation异常,并且不会执行进一步的验证 如果使用消息引发StopValidation,则会将其添加到错误列表中,否则,如果没有消息,则不会添加更多错误 如果您使用的是IntegerField、FloatFie

如果选中复选框,我将使用自定义验证器检查字段是否为空。它检查正确,但不管如何,它始终会验证值是否为数字

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


自定义验证器是否有方法停止现场验证

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

如果使用消息引发StopValidation,则会将其添加到错误列表中,否则,如果没有消息,则不会添加更多错误

如果您使用的是IntegerField、FloatField等。。您还必须记住在输入强制时发生的“处理错误”。可选验证器处理此问题的方式是,如果输入为空,它将清除所有以前的错误。让我们快速查看wtforms/fields.py中可选验证器的代码:

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

的可能副本供参考。