WTForms: передача другого контейнера в валидатор

1

Рассмотрев этот ответ, у меня возникли проблемы с получением моего настраиваемого валидатора WTForm для принятия другого аргумента.

Как мой код является структурой, так это то, что у меня есть метод form_create(), который вызывается следующим образом:

    form = other_file.form_create(
        form='page_settings',
        data=data,
        all_applications=all_applications,
    )

all_applications, являющийся dict, мне нужно индексировать один из моих валидаторов. 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, но даже после того, как он поместил его в метод init HostName:

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?

Теги:
wtforms

1 ответ

1
Лучший ответ

Вы можете установить 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']}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню