可选验证器允许两个空值,如果该值不存在(来自docs):
class wtforms.validators.Optional(strip_whitespace = True)
允许空输入并停止验证链继续。
如果输入为空,还会删除先前的错误(例如处理 来自现场的错误。
我在一个字段上有一些额外的验证器,我想如果这些验证器运行,即使输入是一个空字符串。如果输入是空字符串,则内置Optional
验证器会跳过其余的验证器。是否有内置或任何其他方式来实现这一目标?
我正在使用此表单来验证PUT
次请求。我们假设我的用户实体的ID为username
,middlename
为可选字段。然后,字段的验证器看起来像:
class UserUpdateForm(Form):
username = fields.StringField('username', [
validators.Optional(),
validators.Length(min=5, max=500)
])
middlename = fields.StringField('middlename', [
validators.Optional()
])
所以我会允许没有PUT
或username
参数的middlename
个请求,这些请求会保持字段不变。但是,当参数存在且为空字符串时,我希望username
字段验证因Length
验证器而失败,但我允许将middlename
字段设置为空字符串。
从另一个角度来看:我想区分非现有参数和空字符串参数。
答案 0 :(得分:3)
我看了一下Optional
验证器的来源:
class Optional(object):
...
def __call__(self, form, field):
if not field.raw_data or isinstance(field.raw_data[0], string_types) and not self.string_check(field.raw_data[0]):
field.errors[:] = []
raise StopValidation()
正如您在and not self.string_check(field.raw_data[0])
中所看到的,此处明确考虑空字符串。我想知道如果我发送了两个像a=foo&a=&b=bar
这样的值会发生什么。
无论如何,我的快速解决方案是实现一个新的验证器:
class OptionalButNotEmpty(object):
"""
Allows missing but not empty input and stops the validation chain from continuing.
"""
# Code is a modified version of `Optional` (https://github.com/wtforms/wtforms/blob/master/wtforms/validators.py#L148)
field_flags = ('optional', )
def __call__(self, form, field):
if not field.raw_data:
raise wtforms.validators.StopValidation()