【问题标题】:How to use wtforms SelectField depending on dynamic attributes with flask & flask-sqlalchemy?如何根据flask和flask-sqlalchemy的动态属性使用wtforms SelectField?
【发布时间】: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-alchemyQuerySelectField 对此进行了tutorial

标签: python flask sqlalchemy flask-sqlalchemy flask-wtforms


【解决方案1】:
    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 类下初始化它为我解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2017-08-28
    • 1970-01-01
    • 2021-05-15
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多