从多个表单/同一表单flask的数组传递数据wtforms-python



我正在尝试制作一个烧瓶应用程序,该应用程序从sqlite数据库中提取问题,然后让您为每个问题提交分数和注释。我很难理解如何为所有问题生成表格,也无法将表格中的数据传回我的烧瓶应用程序。我当前的网页如下:

当前网页

我用来生成它的html文件如下所示:

record.html

<doctype html="">
{% from "_formhelpers.html" import render_field %}
<form method="post">
<table>
{% for key, value in form_dict.items() %}
<TR>
{% set x = key[4:]|int %}
<TD class="c1">{{ question_list[x-1] }}</TD>
<TD class="c1">{{ key }}</TD>
<TD class="c2">{{ render_field(value.score) }}</TD>
<TD class="c3">{{ render_field(value.comment) }}</TD>
</TR>
{% endfor %}
</table>
<p><input type="submit" value="Submit"></p></form>
</doctype>

python/flask代码如下:

class Record_Form(Form):
score_choices = [('0.00', '0.00'),
('0.25', '0.25'),
('0.50','0.50'),
('0.75','0.75'),
('1.00','1.00')]
score = SelectField('Score', choices=score_choices)
comment = StringField('Comment')
owner = StringField('Owner')
@app.route('/record/<id>', methods=['GET', 'POST'])
def new_record(id):
form = Record_Form(request.form)
question_list_qry = Question.query.all()
question_list = []
question_ids_list = []
for i in question_list_qry:
question_list.append(i.question)
question_ids_list.append(i.id)
form_dict={}
for id in question_ids_list:
form_dict[f'form{id}'] = Record_Form(request.form)
if request.method == 'POST' and form.validate():
print(form_dict['form1'].score.data)
print(form_dict['form2'].score.data)
print(form_dict['form3'].score.data)
print(form_dict['form1'].comment.data)
print(form_dict['form2'].comment.data)
print(form_dict['form3'].comment.data)
return redirect('/')
return render_template('record.html', question_list=question_list, form_dict=form_dict)

目前,如果我进入我的烧瓶应用程序,在前三个问题中提交三个不同的分数和三条不同的评论。结果输出仅来自"form1"。

三种不同的分数和评论

但这是我得到的输出:

0.25
0.25
0.25
Dog
Dog
Dog

我做错了什么?我认为这与形式有关。验证,但我不确定。

这是呈现的HTML:

<form method="post">
<table>
<TR>
<TD class="c1">Question 1</TD>
<TD class="c1">form1</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 2</TD>
<TD class="c1">form2</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 3</TD>
<TD class="c1">form3</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 4</TD>
<TD class="c1">form4</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 5</TD>
<TD class="c1">form5</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 6</TD>
<TD class="c1">form6</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 7</TD>
<TD class="c1">form7</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 8</TD>
<TD class="c1">form8</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 9</TD>
<TD class="c1">form9</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 10</TD>
<TD class="c1">form10</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 11</TD>
<TD class="c1">form11</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
<TR>
<TD class="c1">Question 12</TD>
<TD class="c1">form12</TD>
<TD class="c2">
<dt><label for="score">Score</label>
</dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>
</dd>
</TD>
<TD class="c3">
<dt><label for="comment">Comment</label>
</dt><dd><input id="comment" name="comment" type="text" value="">
</dd>
</TD>
</TR>
</table>
<p><input type="submit" value="Submit"></p></form>
</doctype>

这是因为所有select标记和所有input标记都有相同的name。如果它们都在同一个字段中,则需要使用不同的名称,否则它们将被彼此覆盖。

record.html

<doctype html="">
{% from "_formhelpers.html" import render_field %}
<form method="post">
<table>
{% for key, value in form_dict.items() %}
<TR>
{% set x = key[4:]|int %}
<TD class="c1">{{ question_list[x-1] }}</TD>
<TD class="c1">{{ key }}</TD>
<TD class="c2">{{ render_field(value.score, name='score'+str(x)) }}</TD>
<TD class="c3">{{ render_field(value.comment, name='comment'+str(x)) }}</TD>
</TR>
{% endfor %}
</table>
<p><input type="submit" value="Submit"></p></form>
</doctype>

您还需要更改服务器代码,如下所示:

form_dict['form1']['score1']
form_dict['form2']['score2']
form_dict['form3']['score3']

最新更新