跨Flask蓝图管理QuerySelectField

时间:2014-09-04 08:47:05

标签: flask

我已经通过各种教程+在Stackoverflow / Google上搜索,但未能找到关于如何使用几个Flask蓝图使用QuerySelectField的答案,可能你可以提供帮助。 基本上,我在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来检索项目表单中的客户端名称时,我就会陷入困境,这是我目前在我的projects / 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())

并且还建议在"类ProjectForm(Form)"之前首先声明类似下面的内容:

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

在所有情况下,我最终都会遇到NameError:name' Client'没有定义,我知道我必须说某个程序应该看我的类Client,但我找不到位置,除非问题出在其他地方。 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我是这样做的:

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

然后:

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