我难以根据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
具有相同的行为。)
我该怎么做?
答案 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)