WTForms 中的可选但不是空字段
Optional but not empty field in WTForms
可选验证器允许空值,如果值不存在(来自 docs):
class wtforms.validators.Optional(strip_whitespace=True)
Allows empty input and stops the validation chain from continuing.
If input is empty, also removes prior errors (such as processing
errors) from the field.
我在一个字段上有一些额外的验证器,我希望这些验证器 运行 即使输入是空字符串。如果输入是空字符串,内置的 Optional
验证器会跳过其余的验证器。是否有内置或任何其他方式来实现此目的?
编辑:关于我的用例的更多细节
我正在使用此表单来验证 PUT
请求。假设我有用户实体,其中 username
s 作为 ID,middlename
s 作为可选字段。然后字段的验证器看起来像:
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
字段设置为空字符串。
换个角度:我想区分非存在参数和空字符串参数
我看了一下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()
可选验证器允许空值,如果值不存在(来自 docs):
class wtforms.validators.Optional(strip_whitespace=True)
Allows empty input and stops the validation chain from continuing.
If input is empty, also removes prior errors (such as processing errors) from the field.
我在一个字段上有一些额外的验证器,我希望这些验证器 运行 即使输入是空字符串。如果输入是空字符串,内置的 Optional
验证器会跳过其余的验证器。是否有内置或任何其他方式来实现此目的?
编辑:关于我的用例的更多细节
我正在使用此表单来验证 PUT
请求。假设我有用户实体,其中 username
s 作为 ID,middlename
s 作为可选字段。然后字段的验证器看起来像:
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
字段设置为空字符串。
换个角度:我想区分非存在参数和空字符串参数
我看了一下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()