在Flask应用配置中的WTForms SelectField中设置默认值?

时间:2018-09-17 16:24:40

标签: python flask flask-wtforms wtforms

我难以根据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问题-主要问题似乎是How do you set a default value for a 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'],它不会在表单中而是在结果中将配置值设置为默认值。

我还尝试了Setting default value after initialization in SelectField flask-WTForms问题中讨论的技术,将我的form调用更改为form = MySearchForm(request.args, page_size=current_app.config['PAGE_SIZE'])。这也不能正常工作:在初始调用中,表单没有被选择(在这种情况下,因此显示值为“ 10”);配置的值可正确用于搜索本身,但是page_size的格式值仍为“ 10”。此外,实际上选择表格中的值没有任何作用;无论用户在表单中选择什么,都将使用配置的值。 (类似地,手动更改URL中的page_size具有相同的行为。)

我该怎么做?

1 个答案:

答案 0 :(得分:1)

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

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