我已经通过各种教程+在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,但我找不到位置,除非问题出在其他地方。 在此先感谢您的帮助。
答案 0 :(得分:0)
我是这样做的:
def get_clients():
from forms import Client
return Client.query.all()
然后:
client_id = QuerySelectField('Select Client', query_factory=get_clients)