Python 在Flask app config的WTForms SelectField中设置默认值?

Python 在Flask app config的WTForms SelectField中设置默认值?,python,flask,flask-wtforms,wtforms,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)

我很难根据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
即使它似乎是正确的位置,我也不能通过将app config传递给this文件来将默认值设为变量,因为我得到了一个“在应用程序上下文之外工作”错误。所以我想我必须在运行时在Flask视图中使用一个动态默认值

我已经研究了其他一些关于这方面的问题,主要的问题似乎是——但我无法让它们中的任何一个起作用

搜索视图的My
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\u size.default=current\u app.config['page\u size']]
,然后按照建议
form.process()
,这会清除搜索表单中的任何其他内容,因此
title
不会通过。如果我尝试
form.page\u size.data=current\u app.config['page\u size']
,它不会将配置值设置为表单中的默认值,而只是在结果中设置

我还尝试了问题中讨论的技巧,将我的
form
调用更改为
form=MySearchForm(request.args,page\u size=current\u app.config['page\u size'])
。这也不能正常工作:在初始调用时,表单没有选择任何内容(在本例中,因此显示值“10”);配置的值正确用于搜索本身,但
page\u size
的表单值保持为“10”。此外,实际选择表单中的值没有效果;无论用户在表单中选择什么,都将使用配置的值。(类似地,手动更改URL中的
页面大小
也有相同的行为。)


我该怎么做?

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

为此,在
选择字段
中,使用参数
强制

如果变量
app.config['PAGE\u SIZE']
是一个
int
,则您希望如下声明表单字段:

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

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

为此,在
选择字段
中,使用参数
强制

如果变量
app.config['PAGE\u SIZE']
是一个
int
,则您希望如下声明表单字段:

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

您是否尝试过使用此
SelectField
concurve
属性?另外,检查
app.config['PAGE\u SIZE']
的类型,如果它是
int
str
并且它与
form.PAGE\u SIZE.default
form.PAGE\u SIZE.data
的类型匹配,这取决于您选择设置此表单字段值的解决方案。啊,就是这样!是的,该值是一个
int
,所做的只是在
SelectField
声明中将
str
强制到它。非常感谢。我来自Perl,这里没有这些问题;这已经咬了我好几次了。请注意:上面“设置默认值”问题中的第二个解决方案有效。您是否尝试过使用此
SelectField
improve
属性?另外,检查
app.config['PAGE\u SIZE']
的类型,如果它是
int
str
并且它与
form.PAGE\u SIZE.default
form.PAGE\u SIZE.data
的类型匹配,这取决于您选择设置此表单字段值的解决方案。啊,就是这样!是的,该值是一个
int
,所做的只是在
SelectField
声明中将
str
强制到它。非常感谢。我来自Perl,这里没有这些问题;这已经咬了我好几次了。作为记录:上面的第二个解决方案,来自“设置默认值”问题,有效。