【问题标题】:Wtforms QueryselectField doesn't pass idWtforms QueryselectField 不传递 id
【发布时间】:2015-07-07 17:11:34
【问题描述】:
  • 我有两个一对多关系的表,表 Project 有很多 Reports。
  • 当用户输入报告问题时,她/他必须从下拉列表中选择该报告所属的项目。
  • 下拉列表显示项目名称,但 add_report() 在 db.session.commit() 处停止,当我打印 _form.project_list.data_ 时,我得到 项目名称 而不是外键.
  • 我相信我的问题出在表单上,​​我尝试了很多代码来获取 project_id,但我得到了“无法打印的 InterfaceError 对象”错误。
  • 我的问题: 如何从下拉列表中获取项目 id 编号而不是项目名称?

views.py

@app.route('/add_report/', methods=['GET', 'POST'])
def add_report():
    form = AddReportForm(request.form)
    if request.method == 'POST':
        if form.validate_on_submit():
            new_report = Report(
                project_id=form.project_list.data,
                issue=form.issue.data)
            db.session.add(new_report)
            db.session.commit()
            flash('New report was successfully added.')
            return redirect(url_for('projects'))
        else:
            flash('All fields are required.')
            return redirect(url_for('projects'))
    return render_template('project.html', form=form)

Models.py

class Project(db.Model):
    project_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    date = db.Column(db.Date)
    reports = db.relationship('Report', backref='project', lazy='dynamic')

    def __repr__(self):
        return self.name

class Report(db.Model):
    report_id = db.Column(db.Integer, primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey('project.project_id'))
    issue = db.Column(db.Text)

    def __repr__(self):
        return self.issue

forms.py

def get_projects():
    return Project.query

class AddReportForm(Form):
    project_list = QuerySelectField('Project', query_factory=get_projects)
    issue = StringField('issue')

非常感谢

【问题讨论】:

    标签: python-2.7 flask sqlalchemy wtforms


    【解决方案1】:

    报表表?你的意思是下拉列表?你试过了吗

    project_list = QuerySelectField('Project', query_factory=get_projects, get_label='project_id')
    

    选中此question 以减少查询以仅选择所需的列。

    【讨论】:

    • 感谢您的回复,我试过 get_label='project_id' 得到这个错误:sqlalchemy.exc.InterfaceError InterfaceError:
    • 表单是否显示并且错误发生在提交表单上?如果是这样,您可以在将其添加到数据库之前通过打印来检查您的 form.project_list.data 并确保您获得 project_id 吗?我以为您的问题出在表单显示上,您可能不需要 QuerySelectField 中的 get_label。
    • 调试 add_report() 时,函数在到达db.session.commit() 时停止。当我打印 form.project_list.data 时,我得到像 Project 1 这样的项目名称,而不是外键!
    • 你试过 QuerySelectField('Project', query_factory=get_projects, get_pk = 'project_id').虽然它应该已经自动检测到主键。还要检查客户端的下拉元素,看看它有什么值。
    • 我刚刚做了,但我收到了这个错误:TypeError: 'str' object is not callable。还有这次在调试add_report()的时候,也没有通过if request.method == 'POST':
    【解决方案2】:

    最后我发现我的代码有什么问题:)

    • 我在报告表中使用 project_id(Foreign Key) 来获取项目 id(form.project_list.data) 而不是 projects(relationship)。所以我对models.py和views.py做了一些修改。
      可怜的forms.py,我还以为是你的错!

    models.py

    class Project(db.Model):
        project_id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String)
        date = db.Column(db.Date)
    
        def __repr__(self):
            return self.name
    
    class Report(db.Model):
        report_id = db.Column(db.Integer, primary_key=True)
        project_id = db.Column(db.Integer, db.ForeignKey('project.project_id'))
        projects = db.relationship('Project', backref='report')
        issue = db.Column(db.Text)
    
        def __repr__(self):
            return self.issue
    

    views.py

    @app.route('/add_report/', methods=['GET', 'POST'])
    def add_report():
        form = AddReportForm(request.form)
        if request.method == 'POST':
            if form.validate_on_submit():
                new_report = Report(
                    projects=form.project_list.data,
                    issue=form.issue.data)
                db.session.add(new_report)
                db.session.commit()
                flash('New report was successfully added.')
                return redirect(url_for('projects'))
            else:
                flash('All fields are required.')
                return redirect(url_for('projects'))
        return render_template('project.html', form=form)
    

    forms.py 保持不变

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多