gpt4 book ai didi

python - WTForms:将另一个容器传递给验证器

转载 作者:行者123 更新时间:2023-12-01 09:19:17 27 4
gpt4 key购买 nike

已经看过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)

但我不断收到诸如“Form”对象没有属性“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']}

关于python - WTForms:将另一个容器传递给验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com