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