python - 如何根据flask和flask-sqlalchemy的动态属性使用wtforms SelectField?
问题描述
在一个烧瓶应用程序中,它基本上有两个属性,具有这样的基本关系,例如:
模型.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
于数据库。
我的解决方案是定义一个函数返回一个list
for SelectField[choices]
:
表格.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
部分中工作可以解决这个问题,但我猜这不是最好的解决方案。
解决方案是什么?
解决方案
def __init__(self, *args, **kwargs):
super(AddProjectForm, self).__init__(*args, **kwargs)
self.project_model.choices = [(a.id, a.name) for a in ProjectModel.query.order_by(ProjectModel.id)]
在课堂下初始化它AddProjectForm
为我解决了这个问题。
推荐阅读
- python - Pandas:在测试中处理看不见的数据
- google-chrome-extension - Chrome 扩展程序(和/或 tampermonkey 脚本)未在某些网站(如 gmail)上运行
- android - Android:如何从屏蔽广告的数量和网络带宽消耗来衡量广告屏蔽的效果?
- c - 如何获取 SSDT 地址
- ios - 如何知道 Firebase 是否获取了值
- google-maps - 按评论数量对 Google 地图地点进行排序
- linux - Docker 不会绑定到地址;说它正在使用,但它不是
- sql-server - SQL Server:创建函数
- javascript - Prime 检查程序不适用于某些数字
- reactjs - Firebase 身份验证(多种类型的用户)