WTForms中的可选但不是空字段

时间:2017-06-19 14:50:30

标签: python validation wtforms

可选验证器允许两个空值,如果该值不存在(来自docs):

  

class wtforms.validators.Optional(strip_whitespace = True)

     

允许空输入并停止验证链继续。

     

如果输入为空,还会删除先前的错误(例如处理   来自现场的错误。

我在一个字段上有一些额外的验证器,我想如果这些验证器运行,即使输入是一个空字符串。如果输入是空字符串,则内置Optional验证器会跳过其余的验证器。是否有内置或任何其他方式来实现这一目标?

编辑:有关我的用例的更多细节

我正在使用此表单来验证PUT次请求。我们假设我的用户实体的ID为usernamemiddlename为可选字段。然后,字段的验证器看起来像:

class UserUpdateForm(Form):
    username = fields.StringField('username', [
        validators.Optional(),
        validators.Length(min=5, max=500)
    ])
    middlename = fields.StringField('middlename', [
        validators.Optional()
    ])

所以我会允许没有PUTusername参数的middlename个请求,这些请求会保持字段不变。但是,当参数存在且为空字符串时,我希望username字段验证因Length验证器而失败,但我允许将middlename字段设置为空字符串。

从另一个角度来看:我想区分非现有参数和空字符串参数。

1 个答案:

答案 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()