flask中SelectField下拉列表选项的设定

今天遇到一个问题,我的flask项目中的forms.py中需要定义一个SelectField下拉列表(form使用wtforms实现),这个下拉列表需要动态从数据库中加载数据,我初步想直接在forms中定义该SelectField字段的choices值,如下:

project_id=SelectField(u'选择项目', choices=[(p.id, p.project_name) for p in Project.query.all()],coerce=int,validators=[DataRequired(message=u"项目名称不能为空")])

结果报错:

RuntimeError: application not registered on db instance and no application bound to current context

stackoverflow上的解决方案是,将db的实例化,即

db = SQLAlchemy()

定义在一个单独的文件中(这里起名shared.py),并放置于项目根目录,shared.py内容如下:

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

然后在任何其他文件中,涉及到db的地方时,全部都从shared.py中引入,这样就可避免循环引用以及上面出现的app没有注册在db实例上的问题。
但我这样做了还是不行,于是试了试这种方式:
将forms.py中SelectField字段的choices去掉,如下:

project_id=SelectField(u'选择项目', coerce=int,validators=[DataRequired(message=u"项目名称不能为空")])

然后在视图函数中实例化form后,设置choices值即可,如下:

form=InterfaceForm()
form.project_id.choices = [(a.id, a.project_name) for a in Project.query.all()]

这样就解决了,如果有遇到同样问题的同学可以参考下。

标签: flask, selectfield

三剑客-一站式接口测试与管理平台:sanjianke.tech

转载声明:除非特别声明,本博客文章均属原创,转载请注明出处,谢谢!

PS:本博采用老薛主机托管,欢迎购买老薛主机并使用推荐码:yanyaozhen,初次购买享受25%折扣。