【发布时间】:2018-02-05 04:32:17
【问题描述】:
使用 FlaskForm 和 SelectMultipleField,我正在创建一个选择表,允许对多项选择进行排名:1、2、3、...。
为了将选项以网格模式放置在表格中,我将每一行设为自己的 SelectMultipleField 实例。
提交按钮只返回 SelectMultipleField (dogs) 的第一个实例的值。
如何让提交按钮返回 SelectMultipleField 的所有实例中的值?
这是我的表单模块中的类:
class LPRForm(FlaskForm):
party = ['Dogs', 'Cats', 'Rabbits', 'Birds']
dog = [('', 'D. Duke'), ('', 'R. Rusty'), \
('', 'T. Tucker'), ('', 'R. Roger')]
cat = [('', 'S. Shadow'), ('', 'M. Misty'), \
('', 'P. Patch'), ('', 'P. Paws')]
rabbit = [('', ''), ('', 'C. Clover'), ('', ''), ('', '')]
bird = [('', 'P. Pikachu'), ('', 'S. Starburst'), \
('', ''), ('', 'F. Flighty')]
vote_dog = SelectMultipleField('District', choices=dog,
option_widget=widgets.TextInput() )
vote_cat = SelectMultipleField('District', choices=cat,
option_widget=widgets.TextInput() )
vote_rabbit = SelectMultipleField('District', choices=rabbit,
option_widget=widgets.TextInput() )
vote_bird = SelectMultipleField('District', choices=bird,
option_widget=widgets.TextInput() )
submit = SubmitField('Cast Ballot')
这是html文件的相关部分:
<table style="width:100%" align="center">
<tr>
<td> </td>
{% for vote in form.vote_dog %}
{% if vote.label != '': %}
<td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>
{% endif %}
{% endfor %}
</tr>
<tr>
<td> </td>
{% for vote in form.vote_cat %}
{% if vote.label != '': %}
<td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>
{% endif %}
{% endfor %}
</tr>
<tr>
<td> </td>
{% for vote in form.vote_rabbit %}
{% if vote.label != '': %}
<td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>
{% endif %}
{% endfor %}
</tr>
<tr>
<td> </td>
{% for vote in form.vote_bird %}
{% if vote.label != '': %}
<td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>
{% endif %}
{% endfor %}
</tr>
</table>
</td>
</tr>
{{ form.submit }}
还有视图模块:
@app.route('/lpr', methods=['GET', 'POST'])
def lpr():
form = LPRForm()
return render_template('lpr.html', title='Home', form=form)
【问题讨论】:
-
你的 html 模板有没有表单标签?
lpr()也需要form = LPRForm(request.POST)或类似的,否则你总是在处理一个没有提交用户数据的新表单(GET方法的表单)。 -
@progmatico 我的模板没有表单标签。我正在使用
form=LPRForm(),浏览器正在将用户数据提交回服务器。request.POST的目的是什么? -
嗯...您的代码没问题。我建议使用瓶子和 WTForms 的常用模式。看起来 Flask 有细微的差别,模式不适用。
request.POST给你一个瓶中的MultiDict,然后你用它作为表单对象属性的模板来实例化表单(在发布操作之后,字段将被填充)。我认为从 Flask 文档中没有request.POST,并且看起来不需要这种方式。可能request.form给出了同样的结果。
标签: python flask flask-wtforms