WTForms: пользовательский валидатор на основе данных БД?

Можно ли в WTForms создать собственный валидатор на основе данных из базы данных?

Например, я хочу показать поле множественного выбора, в котором пользователи могут выбирать только определенное количество значений в зависимости от типа их учетной записи (хранящихся в БД).

Предполагаемое поведение таково:

  1. Если форма отправлена, проверьте, сколько значений выбрано.
  2. Запустите запрос к БД, получите тип учетной записи.
  3. Проверьте, меньше ли № 1 или равно № 2.
  4. Если да, то считай это действительным.

Это возможно?


person okoboko    schedule 17.06.2014    source источник


Ответы (1)


Вы можете написать собственный валидатор, который будет делать все, что вы можете делать на Python:

user = # get user from request context

def account_type_check(form, field):
    account = get_account_for_user(user) # insert your account retrieval logic here

    if len(field.data) > account.user_limit:
        raise ValidationError('Submission exceeded user's account type limit')

class SelectionForm(Form):
    selection = MultiSelectField('Selection', [account_type_check])

Стоит отметить, что вы, возможно, используете нецелевой инструмент для такого рода вещей. Библиотека проверки форм предназначена для обеспечения СУХОГО подхода к проверке отправленных форм. Это хорошо работает для проверки длины строк, того, что числа находятся в пределах диапазона и т. д. Как только сценарии проверки становятся достаточно сложными, вы тратите больше времени на то, чтобы заставить библиотеку удовлетворить ваши потребности, чем потребовалось бы, чтобы написать проверку самостоятельно.

person nsfyn55    schedule 18.06.2014
comment
У меня возникли проблемы с поиском правильного места для размещения этого метода. Если он попадет в мои формы.py, у меня не будет доступа к данным current_user. Если это будет в моем views.py, определение account_type_check в forms.py будет проблемой. о чем ты думаешь? - person okoboko; 18.06.2014
comment
Вы можете импортировать что угодно в любое другое пространство имен. from views import account_type_check, где я предполагаю, что account_type_check имеет доступ к данным пользователя. Или вы можете поместить их все в один файл. Фласк не будет заботиться. - person nsfyn55; 18.06.2014
comment
По какой-то причине, если я определяю account_type_check в своем представлении, я получаю NameError: name 'SelectionForm' is not defined.. Если я удалю метод, моя форма загружается нормально. - person okoboko; 18.06.2014
comment
вам следует составить еще один вопрос с минимальным рабочим образцом, демонстрирующим вашу проблему. У меня недостаточно информации из этих комментариев, чтобы помочь вам. - person nsfyn55; 18.06.2014
comment
Опубликовано! stackoverflow.com/questions/24289687/ - person okoboko; 18.06.2014