首页 > 解决方案 > 如何根据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于数据库。

我的解决方案是定义一个函数返回一个listfor 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部分中工作可以解决这个问题,但我猜这不是最好的解决方案。

解决方案是什么?

标签: pythonflasksqlalchemyflask-sqlalchemyflask-wtforms

解决方案


    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为我解决了这个问题。


推荐阅读