MKa*_*ras 8 python flask wtforms
如果选中复选框,我正在使用自定义验证器来检查字段是否为空.它检查正确,但无论它是否总是在验证值是否为数字.
基本上我需要一个字段来停止在表单的某些条件下进行验证.
有没有办法让自定义验证器停止对该字段的验证?
Cra*_*ast 14
是的,自定义验证器可以像内置的Optional和Required验证器一样控制验证流程.要控制验证流程,请使用该StopValidation
异常,不再进行进一步的验证.
如果使用消息引发StopValidation,则会将其添加到错误列表中,否则如果没有消息,则不会再添加错误.
如果您正在使用IntegerField,FloatField等,您还必须记住在输入强制时发生的"处理错误".Optional validator处理此方法的方式是,如果输入为空,它将清除所有先前的错误.让我们快速浏览一下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()
Run Code Online (Sandbox Code Playgroud)
如果没有输入或空白输入,你可以看到其中的一件事,它是否会清除以前的任何错误.
那么,让我们来看看你如何做自定义验证器.
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()
Run Code Online (Sandbox Code Playgroud)
然后你可以使用你的验证器:
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)])
Run Code Online (Sandbox Code Playgroud)
那么,如果选中该复选框,它将验证mynumber是否为输入的数字.此外,将运行NumberRange验证器.如果未选中,将清除错误,StopValidation将阻止NumberRange运行.