Как вы сохраняете 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 вы передали его со старыми данными.