【问题标题】:manage QuerySelectField across Flask blueprints跨 Flask 蓝图管理 QuerySelectField
【发布时间】:2014-09-04 19:08:21
【问题描述】:

我已经通过 Stackoverflow / Google 上的各种教程 + 搜索,但未能找到一些关于如何使用 QuerySelectField 使用几个 Flask 蓝图的答案,也许你可以提供帮助。 基本上,我在我的 models.py 中定义了一个 Project 类和一个 Client 类,如下所示:

class Project(db.Model):
    __tablename__ = 'projects'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(128), nullable=False)
    description = db.Column(db.Text)
   client_id = db.Column(db.Integer, db.ForeignKey('clients.id'))

class Client(db.Model):
    __tablename__ = 'clients'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=False)
    location = db.Column(db.Text, nullable=False)
    projects = db.relationship('Project', lazy='dynamic', backref='project')

然后,我为每个部分制定了蓝图,一张用于管理我的项目,另一张用于我的客户。 然后,当我尝试使用 QuerySelectField 在我的项目表单中检索客户名称时,我遇到了困难,这是我目前在我的项目/forms.py 中所拥有的:

from flask.ext.wtf import Form
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from wtforms.validators import Length, Required
from wtforms.fields.html5 import DateField


class ProjectForm(Form):
    title = StringField('Title', validators=[Required(), Length(1, 128)])
    description = TextAreaField('Desciption')
    date = DateField('Date', format='%d/%m/%Y')
    client_id = QuerySelectField('Select Client', validators=[Required()], coerce=int, choices = [(1, 'abc'), (2, 'defg'), (3, 'hij')])
    submit = SubmitField('Submit')

    def from_model(self, project):
        self.title.data = project.title
        self.description.data = project.description
        self.client_id.data = project.client_id
        self.date.data = project.date

    def to_model(self, project):
        project.title = self.title.data
        project.description = self.description.data
        project.client_id = self.client_id.data
        project.date = self.date.data

我知道这个版本没有选择任何客户端,因为我正在传递静态数据 i/o 动态数据,但至少它可以工作,并且我可以看到我的 SelectField 具有可能的值。我读过我应该使用类似

client_id = QuerySelectField('Select Client', query_factory=lambda: Client.query.all())

并且还建议在“class ProjectForm(Form)”之前先声明如下内容:

def client_id():
    return Client.query.filter_by(enabled=True)

在所有情况下,我最终都会遇到 NameError: name 'Client' is not defined,我知道我必须在某个地方说程序应该查看我的类 Client,但我找不到在哪里,除非问题出在某个地方别的。 提前感谢您的帮助。

【问题讨论】:

    标签: flask


    【解决方案1】:

    我就是这样做的:

    def get_clients():
        from forms import Client
        return Client.query.all()
    

    然后:

    client_id = QuerySelectField('Select Client', query_factory=get_clients)
    

    【讨论】:

    • 非常感谢 Mehdi,我主要是缺少“从表单导入客户端”来使其运行。
    猜你喜欢
    • 2014-10-08
    • 2012-09-14
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多