В приложении flask, которое имеет в основном два атрибута с базовым отношением c, например, таким:
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
в базе данных.
Мое решение состоит в определении функции, возвращающей list
для SelectField[choices]
:
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())
Пока запущено приложение flask, SelectField
выводит список всех объектов в базе данных до запуска приложения. Но во время этого сеанса, если будет добавлена какая-либо другая модель проекта, она не будет перечислять их до тех пор, пока приложение не будет перезапущено.
Работа с этой формой в исправлениях раздела rout.py & @app.route
это, но это не лучшее решение, я думаю.
Каким было бы решение для этого?