【发布时间】:2018-02-26 12:38:36
【问题描述】:
我一直试图弄清楚为什么我的 Flask 表单无法正确验证我的选择字段选项,即使这些选项来自选择字段选项。
我的假设是从服务器传回的 select 选项是 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)
index.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 %}
输出
{'platforms': 'None'}
ImmutableMultiDict([('platform', u'test')])
{'platforms': [u'Not a valid choice']}
编辑: 我解决了这个问题。这是我通过 HTML 和 Jinja 创建 Select 下拉菜单的方式。当传递回 Python 时,遍历选项并创建选项标记似乎不会实例化表单数据本身中的任何内容。将整个 for 循环更改为
{{form.platforms}}
创建了一个实际有效的选择下拉字段。
【问题讨论】:
标签: python html flask flask-wtforms