如何使用Python / Flask安装程序正确提交使用Jinja的平台的结果 [英] How do I correctly submit results from a wtformusing Jinja with a Python /Flask setup

查看:209
本文介绍了如何使用Python / Flask安装程序正确提交使用Jinja的平台的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



而不是使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆