我一直试图找出为什么我的 Flask 表单无法正确验证我的选择字段选择,即使这些选择来自选择字段选项。
我的假设是,从服务器传回时的选择选项是 unicode,并且正在与作为字符串的选择进行比较,但是,我认为 coerce=str 可以解决这个问题。我打印出了表单数据和请求数据,这是下面的输出。为什么它不起作用?
我的代码附在下面,从输出字典中删除了 csrf 令牌密钥。这看起来是一件很简单的事情,但我却想不通。
forms.py
class PlatformForm(FlaskForm):
platform_options = [('test', 'Test'), ('test2','Test2')]
platforms = wtforms.SelectField('Platforms', choices=platform_options, coerce=str, validators=[DataRequired()])
views.py
@app.route('/', methods=['POST', 'GET'])
def index():
form = forms.PlatformForm()
if form.is_submitted():
print form.data
print request.form
if form.errors:
print form.errors
return render_template('home.html', form=form)
索引.html
{% extends "base.html" %}
{% block content %}
<h4>Select a Platform</h4>
<form method="POST">
{{ form.csrf_token }}
<select class="custom-select" name="platform">
{% for value, text in form.platforms.choices %}<br>
<option value="{{ value }}">{{ text }}</option>
{% endfor %}
</select>
<button id="submit_inputs" type="submit" class="btn btn-default">Submit</button>
</form>
{% endblock %}
output
{'platforms': 'None'}
ImmutableMultiDict([('platform', u'test')])
{'platforms': [u'Not a valid choice']}
编辑:
我解决了这个问题。这就是我通过 HTML 和 Jinja 创建选择下拉列表的方式。当传递回 Python 时,迭代选择并创建选项标签似乎并没有实例化表单数据本身中的任何内容。将整个 for 循环更改为
{{form.platforms}}
创建了一个实际有效的选择下拉字段。