簡體   English   中英

使用sqlAlchemy查詢動態填充WTForm SelectField

[英]Dynamically Populate WTForm SelectField with sqlAlchemy query

我試圖用來自postgreSQL數據庫中一列的數據動態填充下拉菜單中的選項。 當我嘗試加載表單時,我得到:TypeError:'NoneType'對象不可迭代。 任何幫助將不勝感激。

  File "/usr/lib/python2.7/site-packages/wtforms/widgets/core.py", line 323, in __call__
    for val, label, selected in field.iter_choices():
  File "/usr/lib/python2.7/site-packages/wtforms/fields/core.py", line 454, in iter_choices
    for value, label in self.choices:
TypeError: 'NoneType' object is not iterable

Model.py

class ReqCriterion(Base):
    __tablename__ = 'req_criteria'

    criteria_id = Column(Integer, primary_key=True, server_default=text("nextval('req_criteria_criteria_id_seq'::regclass)"))
    req_id = Column(Integer, nullable=False)
    req_name = Column(Text)
    coi_id = Column(Integer, nullable=False)
    coi_name = Column(Text, nullable=False)
    criteria = Column(Text)

    def __init__(self, criteria, req_name, coi_id, coi_name, req_id):
        self.criteria = criteria
        self.req_id = req_id
        self.req_name = req_name
        self.coi_id = coi_id
        self.coi_name = coi_name

forms.py

class NewProjForm(Form):
    pj_name = StringField('Project Name', validators=[InputRequired(), Length(min=1, max=1000)])
    pj_desc = TextAreaField('Project Description', validators=[InputRequired(), Length(min=1, max=3000)])
    coi_name = SelectField('COI:', validators=[InputRequired()])
    pj_poc_first = StringField('POC First Name', validators=[InputRequired(), Length(min=1, max=500)])
    pj_poc_last = StringField('POC Last Name', validators=[InputRequired(), Length(min=1, max=500)])

app.py

@app.route('/addProjForm', methods=['GET','POST'])
def addProjForm():
        newProj = NewProjForm(request.form)
        newProj.coi_name.choices = db.session.query(ReqCriterion).filter(coi_name)
        if request.method == 'POST' and newProj.validate():
            addProj = Project(request.form['pj_name'], request.form['pj_desc'], request.form['coi_name'], request.form['pj_poc_first'], request.form['pj_poc_last'])
            db.session.add(addProj)
            db.session.commit()
            return redirect(url_for('project_conf', addProj=addProj))

我應該一直使用QuerySelectField和lambda並在模型中添加了repr 這對我有用:

Forms.py

coi_name = QuerySelectField(label='COI', query_factory=lambda: db.session.query(Coi).filter_by(active=1), get_pk=lambda coi_id: coi_id, get_label=lambda coi_name: coi_name, allow_blank=True)

Models.py

def __repr__(self):
        return '{}'.format(self.coi_name)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM