Как вы сохраняете request.form в БД через wtforms или ошибку в обновлении sqlalchemy?

Это вытекает из этого вопроса: проблема обновления SQLalchemy/wtforms - 400 неверный запрос У меня есть фреймворк

вопрос

Когда я отправляю форму, появляется флэш-сообщение с добавлением прогноза, хотя, когда я запрашиваю базу данных, ничего не изменилось?? Может кто-нибудь определить, где я иду не так?

Чего я пытаюсь достичь

Пользователи могут просматривать свои прогнозы, внося изменения в текущие прогнозы. Если новых прогнозов нет, они могут представить новые прогнозы.

Просмотры

# 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)

1 ответ

Решение

Ваше подозрение верно. Вы хотите, чтобы пройти в request.form на ваш PredictionListForm:

form = PredictionListForm(request.form, data=MultiDict(data))

WTForms проверяет внутри request.form первый и единственный, если он не находит в нем данных, он прибегает к data Ключевой аргумент. Если вы не пройдете request.form У WTForms нет запроса на извлечение, поэтому он будет извлекать данные из единственного источника - data Param вы передали его со старыми данными.

Другие вопросы по тегам