WTForms: необязательный пропуск валидатора, хотя данные существуют - PullRequest
0 голосов
/ 20 сентября 2019

Вот извлеченный код:

from wtforms import (
    Form,
    StringField,
    validators,
)


class UserForm(Form):
    email = StringField('Email', validators=[
        validators.Optional(),
        validators.Email(),
    ])


form = UserForm(data={'email': ''})
form.validate()
print(form.errors)  # No errors as expected

form = UserForm(data={'email': 'lem'})
form.validate()
print(form.errors)  # This should have an error

form = UserForm(data={'email': 'lem@email.com'})
form.validate()
print(form.errors)  # No errors as expected

Вывод:

{}
{}
{}

Похоже, что при наличии необязательных пропусков успешно завершаются проверки, есть ли данные в поле или нет.Я подозреваю, что это может быть как-то связано с передачей данных через данные.Я не уверен.

Удаление validators.Optional дает мне то, что я ожидаю:

{'email': ['Invalid email address.']}
{'email': ['Invalid email address.']}
{}

Это поле электронной почты с валидатором электронной почты не имеет значения.Та же проблема существует, даже если вместо этого у меня validators.Length(min=5).

1 Ответ

2 голосов
/ 27 сентября 2019

Проблема связана с тем, что вы используете аргумент data вместо formdata для инициализации формы.Согласно документации formdata используется для передачи данных, поступающих от конечного пользователя после запроса на публикацию, тогда как data и obj используются для предоставления данных во время первоначального запроса на получение, который конечный пользователь может редактировать и отправлять обратно.Поэтому нельзя ожидать, что данные, предоставленные data или obj, будут подтверждены формой, поскольку это будут известные действительные данные из приложения или базы данных.Однако вам придется передать мультидикт, поддерживающий метод getlist, а не простой диктат formdata.Для этой цели вы можете использовать либо werkzeug MultiDict, либо django MultiValueDict.

from werkzeug import MultiDict
from wtforms import Form, StringField, validators

class UserForm(Form):
    email = StringField('Email', validators=[validators.Optional(), validators.Email()]

form = UserForm(formdata=MultiDict({'email': 'lem'}))
form.validate()
...