Проверка в реальном времени на wtform. Могу ли я получить доступ к валидаторам на переднем конце?
У меня есть класс wtform, который выглядит примерно так:
class Registration(Form):
email = StringField('Email', validators=[Required(), Email()])
username = StringField('Username', validators=[Required()])
name = StringField('Name', validators=[Required()])
password = PasswordField('Password',
validators=[
Required(),
EqualTo('confirm_password', message='Your passwords did not match'),
Length(min=6, max=20, message='passwords must be longer than 6 characters')
])
confirm_password = PasswordField('Confirm Password', validators=[Required()])
submit = SubmitField('Register')
def validate_email(self, field):
if User.query.filter_by(email=field.data).first():
raise ValidationError('Email already registered')
def validate_username(self, field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('Username already exists')
Я предполагаю, что WTForms не предлагает какой-либо формы встроенной проверки в реальном времени на внешнем интерфейсе, и это хорошо, но мне интересно, есть ли способ выполнить проверку в реальном времени, используя валидаторы для полей и используя их в некоторых вид javascript.
Например, поле пароля. Пароль должен быть длиннее 6 символов. В этом случае я хочу показать форму проверки примерно так, как они ее набирают:
Однако, как только они введут пароль действительной длины, он покажет это:
У меня проблема с доступом к требованиям и валидаторам wtform, как на странице. Возможно ли это сделать?
1 ответ
Метод, который я использую, не совсем тривиален, но и не слишком сложен. Я прикрепляю обработчики к событиям изменения или размытия в полях, которые хочу проверить. Когда я получаю это событие, мой обработчик собирает значения для всех полей в форме и отправляет ajax-запрос POST на сервер. Сервер теперь имеет всю форму и может выполнять проверку с помощью WTForms. Ответ JSON на этот запрос Ajax представляет собой список ошибок проверки, которые клиент может отображать по мере необходимости.
Подробнее в этом ответе.