2014-09-04 2 views
0

Я прошел через различные учебники + поиск в Stackoverflow/Google, но не смог найти ответы на вопрос о том, как использовать QuerySelectField, используя несколько чертежей Flask, возможно, вы могли бы помочь. В принципе, я определил класс проекта и класс клиента в моем models.py следующим образом:управлять QuerySelectField по чертежам флажков

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 

Я знаю, что эта версия не выбирая любого клиента, поскольку я передаю динамические динамические данные ввода-вывода, но, по крайней мере, он работает, и я могу видеть свой SelectField с возможными значениями. Я прочитал, я должен использовать что-то вроде

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

и был также рекомендуется сначала объявить что-то вроде следующего, прежде чем «класса ProjectForm (форма)»:

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

Во всех случаях, я в конечном итоге с NameError: имя «Клиент» не определено, я понимаю, что я должен сказать где-то, что программа должна смотреть на мой класс Client, но мне не удалось найти, где, если проблема не где-то в другом месте. Заранее благодарим за помощь.

ответ

0

Я сделал это просто так:

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

, а затем:

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

Большое спасибо Мехди, я был в основном с отсутствующим «от формы импорта клиента», чтобы заставить ее работать. – cdcf

+0

Добро пожаловать! –

Смежные вопросы