这是从这个问题开始的: SQLalchemy/wtforms update issue - 400 bad request I have a flask framework
问题
当我提交表单时,会出现 Flash 消息,说添加了预测,尽管当我查询数据库时没有任何改变?谁能发现我哪里出错了?
我想达到什么目的
用户可以查看他们对当前预测进行更改的预测。如果没有新的预测,那么他们可以提交新的预测。
意见
# Predictor - User makes predictions and saves/
@app.route('/predictor/',methods=['GET','POST'])
@login_required
def predictions():
user_id = g.user.id
# retrieve predictions
prediction= db.session.query(Fixture_prediction,\
Fixture_prediction.fixture_id,Fixture.stage,\
Fixture.home_team,Fixture_prediction.home_score,\
Fixture_prediction.away_score,Fixture.away_team)\
.outerjoin(Fixture,Fixture.id==Fixture_prediction.fixture_id)\
.outerjoin(User,Fixture_prediction.user_id == User.id)\
.filter(Fixture_prediction.fixture_id==Fixture.id)\
.filter(Fixture_prediction.user_id==user_id).all()
data = {'predictions': prediction}
form = PredictionListForm(data=MultiDict(data))
if request.method == 'POST':
if form.validate() == False:
flash('A score is missing, please fill in all predictions')
render_template('predictor.html', form=form)
else:
for prediction in form.predictions:
store=db.session.query(Fixture_prediction) \
.filter(Fixture_prediction.user_id==user_id) \
.filter(Fixture_prediction.fixture_id==prediction.fixture_id.data)\
.update({'home_score':prediction.home_score.data\
,'away_score':prediction.away_score.data})
db.session.commit()
flash('Prediction added')
return redirect(url_for('predictions'))
# display current predictions
elif request.method == 'GET':
return render_template('predictor.html', form=form)
想法 我有一种感觉,下面只是提交最初已经存在的内容,而不是表单请求......
.update({'home_score':prediction.home_score.data\
,'away_score':prediction.away_score.data})
模板
{% extends "base.html" %}
{% block content %}
<h1>Predictions</h1>
<p></p>
<p>Please make your predictions here</p>
<form action='' method='post'>
{{form.predictions()}}
<p><input type="submit" value="Submit Predictions"></p>
</form>
{% endblock %}
模板 - 替代
{% extends "base.html" %}
{% block content %}
<h1>Predictions</h1>
<p></p>
<p>Please make your predictions here</p>
<form action='' method='post'>
<table>
{%for form in form.predictions%}
<tr>
<td>{{form.fixture_id.data}}</td>
<td>{{form.stage.data}}</td>
<td>{{form.home_team.data}}</td>
<td>{{form.home_score(size=1)}}</td>
<td>{{form.away_score(size=1)}}</td>
<td>{{form.away_team.data}}</td>
</tr>
{%endfor%}
</table>
<p><input type="submit" value="Submit Predictions"></p>
</form>
{% endblock %}
楷模
# Fixture prediction table
class Fixture_prediction(db.Model):
__tablename__ = "fixture_prediction"
id = db.Column('fixture_prediction_id',db.Integer, primary_key = True)
fixture_id = db.Column('fixture_id',db.Integer, db.ForeignKey('fixture.fixture_id'))
user_id = db.Column('user_id',db.Integer, db.ForeignKey('user.user_id'))
home_score = db.Column('home_score',db.Integer)
away_score = db.Column('away_score',db.Integer)