WTForms를 사용하여 모델 목록에서 양식을 생성하려면 어떻게 해야 합니까?
-
21-12-2019 - |
문제
다음 목록이 있습니다. Prediction
모델.양식에 바인딩하고 다시 게시할 수 있도록 허용하고 싶습니다.게시물이 홈/외출 점수와 연결되도록 양식을 구성하려면 어떻게 해야 합니까? Prediction
모델의 id
양식에 바인딩하는 각 항목에 대한 필드는 무엇입니까?
보다
@app.route('/predictor/',methods=['GET','POST'])
@login_required
def predictions():
user_id = g.user.id
prediction= # retrieve prediction
if request.method == 'POST':
if form.validate() == False:
flash('A score is missing, please fill in all predictions')
render_template('predictor.html', prediction=prediction, form=form)
else:
for pred in prediction:
# store my prediction
flash('Prediction added')
return redirect(url_for("predictions"))
# display current predictions
elif request.method == 'GET':
return render_template('predictor.html', prediction=prediction, form=form)
형태
class PredictionForm(WTForm):
id = fields.IntegerField(validators=[validators.required()], widget=HiddenInput())
home_score = fields.TextField(validators=[validators.required()])
away_score = fields.TextField(validators=[validators.required()])
주형
<form action="" method="post">
{{form.hidden_tag()}}
<table>
{% for pred in prediction %}
<tr>
<td>{{pred.id}}</td>
<td>{{form.home_score(size=1)}}</td>
<td>{{form.away_score(size=1)}}</td>
</tr>
{% endfor %}
</table>
<p><input type="submit" value="Submit Predictions"></p>
</form>
내 데이터를 올바르게 바인딩할 수 없습니다. POST
.게시 데이터에 모든 항목이 누락되어 필수 유효성 검사기가 계속 실패합니다. 필수의 필드.
해결책
예측 목록의 항목에 바인딩할 하위 양식이 필요합니다.
설명하신 양식을 사용하면 단일 예측만 제출할 수 있습니다.반복 가능한 예측을 바인딩하고 각각에 대해 홈 및 어웨이 예측을 원하는 것처럼 보이기 때문에 불일치가 있는 것 같습니다.실제로 현재로서는 결코 다시 게시하지 않습니다. id
필드.이로 인해 항상 양식 유효성 검사가 실패하게 됩니다.내 생각에 당신이 원하는 것은 하위 양식 목록입니다.다음과 같습니다:
# Flask's form inherits from wtforms.ext.SecureForm by default
# this is the WTForm base form.
From wtforms import Form as WTForm
# Never render this form publicly because it won't have a csrf_token
class PredictionForm(WTForm):
id = fields.IntegerField(validators=[validators.required()], widget=HiddenInput())
home_score = fields.TextField(validators=[validators.required()])
away_score = fields.TextField(validators=[validators.required()])
class PredictionListForm(Form):
predictions = FieldList(FormField(PredictionForm))
뷰는 다음과 같은 내용을 반환해야 합니다.
predictions = # get your iterable of predictions from the database
from werkzeug.datastructures import MultiDict
data = {'predictions': predictions}
form = PredictionListForm(data=MultiDict(data))
return render_template('predictor.html', form=form)
귀하의 양식은 다음과 같이 변경되어야 합니다.
<form action='my-action' method='post'>
{{ form.hidden_tag() }}
{{ form.predictions() }}
</form>
이제 이것은 <ul>
와 <li>
FieldList가 수행하는 작업이기 때문에 항목당입니다.스타일을 지정하고 표 형식으로 만드는 것은 여러분의 몫입니다.조금 까다로울 수도 있지만 불가능하지는 않습니다.
POST a에서는 각 예측의 홈 및 어웨이 점수가 포함된 형식 데이터 사전을 얻을 수 있습니다. id
.그런 다음 이러한 예측을 다시 SQLAlchemy 모델.
[{'id': 1, 'home': 7, 'away': 2}, {'id': 2, 'home': 3, 'away': 12}]
다른 팁
{% for key in di_RAA %}
<tr>
<td><form id="Run" action="{{ url_for('index') }}" method="post">
<input type="submit" class="btn" value="TEST" name="RUN_{{key}}">
</form></td>
</tr>
{% endfor %}
.
여러 버튼을위한 다른 간단한 솔루션을 제공합니다. FieldList는 각 버튼의 이름과 트리거 기능을 가져 오는 것이 좋습니다.
from wtforms import fields
from wtforms.fields import FieldList, FormField
from wtforms import validators
.
일부 팁, 일부 가져 오기를 추가하고 가져 오기 오류 메시지를 정리하십시오.