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

问题描述:

如果选中复选框,我正在使用自定义验证器来检查字段不为空。它检查正确,但无论它总是仍然验证如果该值是一个数字。wtforms自定义验证器可以使字段可选?

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

有没有一种方法让自定义验证器停止验证字段?

+0

[如何在WTForms中有条件地选择字段?](http://*.com/questions/8463209/how-to-make-a-field-conditionally-optional-in-wtforms) – nsfyn55

是的,自定义验证器可以像内置的可选和必需验证器一样控制验证流程。要控制验证流程,请使用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运行。

+0

[自定义验证器的文档](http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators)以供参考。 – JaySeeAre