首页 > 解决方案 > 在 Flask 应用程序配置中的 WTForms SelectField 中设置默认值?

问题描述

我很难根据我的 Flask 应用程序中的配置值在 WTForms SelectField 中设置默认值。

我有一个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']and then 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_sizeURL 具有相同的行为。)

我该怎么做?

标签: pythonflaskflask-wtformswtforms

解决方案


您需要检查要设置的变量类型的一致性。

为此,在您的 中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)

推荐阅读