如何使用Python / Flask安装程序正确提交使用Jinja的平台的结果 [英] How do I correctly submit results from a wtformusing Jinja with a Python /Flask setup
问题描述
而不是使用form.predictions()我试图分开它,所以我可以更好地设计风格,但除了第一个预测之外,当我提交预测的时候,它不起作用。除了第一个预测之外,我没有更新。
我真的不想把它们写出来,因此for循环和循环.index
问题
说如果更新一行的分数,它不更新数据库,虽然我得到一个闪光消息说我有。奇怪的是,只有第1行工作,其他人没有。
视图
$ b
#预测值 - 用户预测并保存/
@ app.route('/ predictor /',methods = ['GET','POST'])
@login_required
def predictions():
user_id = g.user.id
#检索预测
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)\
.filter(Fixture_prediction.fixture_id == Fixture.id)\
.filter(Fixture_prediction.user_id == user_id).all()
data = {'predictions' :预测}
form = PredictionListForm(request.form,data = MultiDict(data))
如果请求.method =='POST':
for 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 ('预测')
db.session.commit()
flash('预测添加')
返回重定向(url_for('predictions'))
#显示当前预测
elif request.method =='GET':
return render_template('predictor.html',form = form)
template
< form action =''method = '后' >
< table>
< tr>
Fixture Id< / th>
阶段< th>
主队< / th>
Home Score< / th>
离开得分< / th>
Away Team< / th>
< / tr>
{%for form in form.predictions%}
< tr>
< td>< input name =predictions - {{loop.index0}} - fixture_idtype =textvalue = {{prediction.fixture_id.data}}>< / td>
< td>< input name =predictions - {{loop.index0}} - stagetype =textvalue ={{prediction.stage.data}}>< / td> ;
< td>< input name =predictions - {{loop.index0}} - home_teamtype =textvalue = {{prediction.home_team.data}}>< / td>
< td>< input name =predictions - {{loop.index0}} - home_scoretype =textvalue = {{prediction.home_score.data}}>< / td>
< td>< input name =predictions - {{loop.index0}} - away_scoretype =textvalue = {{prediction.away_score.data}}>< / td>
< td>< input name =predictions - {{loop.index0}} - away_teamtype =textvalue = {{prediction.away_team.data}}>< / td>
< / tr>
{%endfor%}
< / table>
< p>< input type =submitvalue =提交预测>< / p>
< / form>
我相信问题出在这块代码上:
if request.method =='POST':
用于预测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('预测添加')
返回重定向(url_for('predictions'))
问题是在for循环的第一次迭代之后,您提交您的更改,闪烁消息和重定向。这三个语句需要在 之外如下所示的for循环:
if request.method == 'POST':
预测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'))
What I'm trying to do
Instead of using form.predictions() I've tried to separate it out so I can style it better, although it doesn't work when I submit the predictions apart from the first prediction..i.e doesn't update it apart from the first one.
I don't really want to write them all out hence the for loop and loop.index
Issue
Say if update one row of scores, it does not update the db, although I get a flash message saying I have. Strangely only row 1 works and the others dont.
views
# 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)\
.filter(Fixture_prediction.fixture_id==Fixture.id)\
.filter(Fixture_prediction.user_id==user_id).all()
data = {'predictions': prediction}
form = PredictionListForm(request.form,data=MultiDict(data))
if request.method == 'POST':
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)
template
<form action='' method='post'>
<table>
<tr>
<th>Fixture Id</th>
<th>Stage</th>
<th>Home Team</th>
<th>Home Score</th>
<th>Away Score</th>
<th>Away Team</th>
</tr>
{%for prediction in form.predictions%}
<tr>
<td><input name="predictions-{{loop.index0}}-fixture_id" type="text" value={{prediction.fixture_id.data}}></td>
<td><input name="predictions-{{loop.index0}}-stage" type="text" value="{{prediction.stage.data}}"></td>
<td><input name="predictions-{{loop.index0}}-home_team" type="text" value={{prediction.home_team.data}}></td>
<td><input name="predictions-{{loop.index0}}-home_score" type="text" value={{prediction.home_score.data}}></td>
<td><input name="predictions-{{loop.index0}}-away_score" type="text" value={{prediction.away_score.data}}></td>
<td><input name="predictions-{{loop.index0}}-away_team" type="text" value={{prediction.away_team.data}}></td>
</tr>
{%endfor%}
</table>
<p><input type="submit" value="Submit Predictions"></p>
</form>
I believe the problem is in this block of code:
if request.method == 'POST':
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'))
The problem is after the first iteration of your for loop, you commit your changes, flash a message and redirect. These three statements need to be outside the for loop like below:
if request.method == 'POST':
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'))
这篇关于如何使用Python / Flask安装程序正确提交使用Jinja的平台的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!