Python 2.7 Wtforms QueryselectField未传递id 我有两个一对多关系的表,表项目有许多报告。 用户输入报告问题时,必须从下拉列表中选择此报告所属的项目。 下拉列表显示项目名称,但添加报告在db.session.commit处停止,当我打印_form.project_list.data_时,我得到的是项目名称而不是外键。 我相信我的问题在于表单,我尝试了很多代码来获取项目id,但是我得到了无法打印的InterfaceError对象错误。 我的问题: 如何从下拉列表中获取项目id号而不是项目名称?

Python 2.7 Wtforms QueryselectField未传递id 我有两个一对多关系的表,表项目有许多报告。 用户输入报告问题时,必须从下拉列表中选择此报告所属的项目。 下拉列表显示项目名称,但添加报告在db.session.commit处停止,当我打印_form.project_list.data_时,我得到的是项目名称而不是外键。 我相信我的问题在于表单,我尝试了很多代码来获取项目id,但是我得到了无法打印的InterfaceError对象错误。 我的问题: 如何从下拉列表中获取项目id号而不是项目名称?,python-2.7,flask,sqlalchemy,wtforms,Python 2.7,Flask,Sqlalchemy,Wtforms,views.py Models.py forms.py 非常感谢报告表?你是说下拉列表吗?你试过了吗 project_list = QuerySelectField('Project', query_factory=get_projects, get_label='project_id') 选中此项可将查询减少为仅选择所需的列。最后,我发现我的代码有什么问题: 我在报告表中使用project_idForeign键来获取project idform.project_list.data,而不是pr

views.py

Models.py

forms.py


非常感谢

报告表?你是说下拉列表吗?你试过了吗

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

选中此项可将查询减少为仅选择所需的列。

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

我在报告表中使用project_idForeign键来获取project idform.project_list.data,而不是projectsrelationship。所以我在models.py和views.py中做了一些更改。 可怜的家伙,我还以为是你的错呢! models.py

views.py


forms.py保持不变

感谢您的回复,我尝试获取\u label='project\u id',但出现了以下错误:sqlalchemy.exc.interfaceeerror interfaceeerror:表单是否显示并且错误发生在提交表单上?如果是,您可以在将表单添加到数据库之前通过打印来检查表单.project\u列表。数据,并确保获得项目\u id吗?我认为您的问题出在表单显示上,您可能不需要在QuerySelectField中使用get_标签。调试add_report时,函数在到达db.session.commit时停止。当我打印form.project_list.data时,我得到的是类似于project 1的项目名称,而不是外键!您是否尝试过QuerySelectField'Project',query\u factory=get\u projects,get\u pk='Project\u id'。虽然它应该自动检测到主键。还要检查客户端的下拉元素,看看它有什么值。我刚刚检查了,但我得到了这个错误:TypeError:'str'对象不可调用。另外,在这次调试add_报告时,它没有传递if请求。method==“POST”:。
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
def get_projects():
    return Project.query

class AddReportForm(Form):
    project_list = QuerySelectField('Project', query_factory=get_projects)
    issue = StringField('issue')
project_list = QuerySelectField('Project', query_factory=get_projects, get_label='project_id')
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
@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)