Установить значение по умолчанию в WTForms SelectField из конфигурации приложения Flask? - PullRequest
0 голосов
/ 17 сентября 2018

У меня проблемы с установкой значения по умолчанию в WTForms SelectField на основе значения конфигурации в моем приложении Flask.

У меня есть файл forms.py, который включает, в частности:

class MySearchForm(FlaskForm):
    title = StringField('Title')
    page_size = SelectField('Entries/page', choices=[(10, "10"), (25, "25"), (50, "50"), (100, "100")], default=25)
    # other stuff

Хотя это может показаться подходящим местом, я не могу сделать значение по умолчанию переменной, передав конфигурацию приложения в этот файл, потому что я получаю ошибку «Работа вне контекста приложения».Так что я решил, что мне нужно сделать это с динамическим значением по умолчанию во время выполнения в моем представлении Flask.

Я рассмотрел ряд других вопросов StackOverflow по этому поводу, основным из которых, кажется, является КакВы устанавливаете значение по умолчанию для WTForms SelectField? , но я не могу заставить работать какой-либо из них.

Мой routes.py для вида поиска более или менее похож на это:

form = MySearchForm(request.args)
if request.args: # if not, I display the search form
    if form.title.data:
        # construct relevant part of database query
    page_size = int(form.page_size.data)
    # other stuff: construct and execute DB query; render the view_results page

Если перед оператором if request.args я попробую form.page_size.default = current_app.config['PAGE_SIZE'], а затем form.process(), как предложено, это уничтожит все остальное в форме поиска, поэтому title не будет выполнено.Если я попытаюсь form.page_size.data = current_app.config['PAGE_SIZE'], он не установит значение конфигурации по умолчанию в форме, только в результате.

Я также попробовал метод, рассмотренный в Установка значения по умолчанию после инициализации в вопросе SelectField flask-WTForms , изменив мой form вызов на form = MySearchForm(request.args, page_size=current_app.config['PAGE_SIZE']).Это также не работает должным образом: при первоначальном вызове в форме ничего не выбрано (и в этом конкретном случае, таким образом, отображается значение «10»);настроенное значение правильно используется для самого поиска, но значение формы page_size остается на уровне "10".Кроме того, фактически выбор значения в форме не имеет никакого эффекта;настроенное значение используется независимо от того, что пользователь выбирает в форме.(Точно так же ручное изменение page_size в URL ведет себя так же.)

Как мне это сделать?

1 Ответ

0 голосов
/ 19 сентября 2018

Вам необходимо проверить согласованность типов переменных, которые вы хотите установить.

Для этого в вашем SelectField используйте параметр coerce.

Еслипеременная app.config['PAGE_SIZE'] является int, вы хотите объявить поле формы следующим образом:

page_size = SelectField('Entries/page',
    choices=[(10, "10"), (25, "25"), (50, "50"), (100, "100")],
    default=25,
    coerce=int)
...