Как использовать wtforms SelectField в зависимости от динамических c атрибутов с flask & flask -sqlalchemy? - PullRequest
0 голосов
/ 11 марта 2020

В приложении 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 это, но это не лучшее решение, я думаю.

Каким было бы решение для этого?

1 Ответ

0 голосов
/ 11 марта 2020
    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 решила проблему для меня.

...