【发布时间】:2020-06-22 23:48:57
【问题描述】:
在一个烧瓶应用程序中,它基本上有两个属性,基本关系如下:
models.py
from . import db
class ProjectModel(db.Model):
__tablename__ = "projectmodels"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
projects = db.relationship("Project", backref="projectmodel", lazy="select")
class Project(db.Model):
__tablename__ = "projects"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
project_model_id = db.Column(db.Integer, db.ForeignKey("projectmodels.id"), nullable=False)
创建Project 对象时,wtforms 将有一个SelectField,具体取决于数据库中的projectmodels。
我的解决方案是定义一个函数,为SelectField[choices] 返回一个list:
forms.py
from . import db
from wtforms import *
def projectmodels():
models = ProjectModel.query.all()
models_l = list()
for model in models:
models_l.append((str(model.id), model.name))
return models_l
class AddProjectForm(Form):
name = StringField(label="Project Name")
project_model = SelectField("Project Model",
choices=projectmodels())
当烧瓶应用程序运行时,SelectField 在应用程序运行之前列出数据库中的所有对象。但是在该会话期间,如果添加了任何其他项目模型,它不会列出它们,直到应用程序重新运行。
在 routes.py 和 @app.route 部分中使所有这些表单工作可以解决此问题,但我猜这不是最好的解决方案。
解决办法是什么?
【问题讨论】:
-
PrettyPrinted 使用来自
wtforms-alchemy的QuerySelectField对此进行了tutorial。
标签: python flask sqlalchemy flask-sqlalchemy flask-wtforms