WTForms:将另一个容器传递给验证器
WTForms: passing another container to validator
已经查看了 this 答案,但我无法让我的自定义 WTForm 验证器接受另一个参数。
我的代码的结构是我有一个 form_create() 方法,它通过以下调用:
form = other_file.form_create(
form='page_settings',
data=data,
all_applications=all_applications,
)
all_applications 作为一个字典,我需要为我的一个验证器编制索引。 form_create 如下所示:
def get_form(form=None, *args, **kwargs):
class Form(wtf.Form):
if form == 'page_settings':
my_host_name = HostName('Hostname', validators=[wtf.validators.DataRequired(), validate_hostname, validate_config])
我希望 validate_config 使用字段和 all_applications 中的数据,但即使将其放入 HostName 的 init 方法中也是如此:
class HostName(wtf.StringField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('validators', [
wtf.validators.DataRequired(),
])
all_applications = kwargs.setdefault('all_applications')
super(HostNameField, self).__init__(*args, **kwargs)
但我不断收到类似“表单”对象没有属性“all_applications”的错误
有问题的自定义验证器如下所示:
def validate_config(form, field, all_applications):
if (some logic here is true):
raise wtf.ValidationError(
'some error string here'
)
关于如何让自定义验证器接受另一个容器的任何想法 all_applications
?
您可以在初始化表单时将all_applications
设置为字段的属性,然后通过验证器中的字段访问它。
def validate_config(form, field):
if field.data and field.all_applications is not None:
if field.data not in field.all_applications:
raise ValidationError('Invalid config')
class F(Form):
foo = StringField(validators=[validate_config])
def __init__(self, *args, **kwargs):
all_applications = kwargs.pop('all_applications', None)
super().__init__(*args, **kwargs)
# Make all_applications an attribute of field foo
self.foo.all_applications = all_applications
>>> from webob.multidict import MultiDict
>>> f = F(formdata=MultiDict(foo='a'), all_applications={'a': 1})
>>> f.validate()
True
>>> f = F(formdata=MultiDict(foo='b'), all_applications={'a': 1})
>>> f.validate()
False
>>> f.errors
{'foo': ['Invalid config']}
已经查看了 this 答案,但我无法让我的自定义 WTForm 验证器接受另一个参数。
我的代码的结构是我有一个 form_create() 方法,它通过以下调用:
form = other_file.form_create(
form='page_settings',
data=data,
all_applications=all_applications,
)
all_applications 作为一个字典,我需要为我的一个验证器编制索引。 form_create 如下所示:
def get_form(form=None, *args, **kwargs):
class Form(wtf.Form):
if form == 'page_settings':
my_host_name = HostName('Hostname', validators=[wtf.validators.DataRequired(), validate_hostname, validate_config])
我希望 validate_config 使用字段和 all_applications 中的数据,但即使将其放入 HostName 的 init 方法中也是如此:
class HostName(wtf.StringField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('validators', [
wtf.validators.DataRequired(),
])
all_applications = kwargs.setdefault('all_applications')
super(HostNameField, self).__init__(*args, **kwargs)
但我不断收到类似“表单”对象没有属性“all_applications”的错误
有问题的自定义验证器如下所示:
def validate_config(form, field, all_applications):
if (some logic here is true):
raise wtf.ValidationError(
'some error string here'
)
关于如何让自定义验证器接受另一个容器的任何想法 all_applications
?
您可以在初始化表单时将all_applications
设置为字段的属性,然后通过验证器中的字段访问它。
def validate_config(form, field):
if field.data and field.all_applications is not None:
if field.data not in field.all_applications:
raise ValidationError('Invalid config')
class F(Form):
foo = StringField(validators=[validate_config])
def __init__(self, *args, **kwargs):
all_applications = kwargs.pop('all_applications', None)
super().__init__(*args, **kwargs)
# Make all_applications an attribute of field foo
self.foo.all_applications = all_applications
>>> from webob.multidict import MultiDict
>>> f = F(formdata=MultiDict(foo='a'), all_applications={'a': 1})
>>> f.validate()
True
>>> f = F(formdata=MultiDict(foo='b'), all_applications={'a': 1})
>>> f.validate()
False
>>> f.errors
{'foo': ['Invalid config']}