问题:为什么我的烧瓶表单验证返回不是一个有效的选择?

我一直在试图弄清楚为什么我的 Flask 表单无法正确验证我的选择字段选择,即使这些选择来自选择字段选项。

我的假设是从服务器传回的 select 选项是 unicode 并且正在与作为字符串的选项进行比较,但是,我认为 coerceu003dstr 可以解决这个问题。我打印出表单数据和请求数据,即下面的输出。为什么它不起作用?

我的代码附在下面,从输出字典中删除了 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}}

创建了一个实际有效的选择下拉字段。

解答

你的名字不匹配。在表单中,您将选择字段命名为platforms(复数)。在 HTML 中,您使用platform(单数)。

我建议您让 WTForms 为您生成 HTML,而不是手动呈现模板中的字段。对于表单标签,可以使用{{ form.platforms.label }},对于实际字段{{ form.platforms() }}。您可以传递任何您想要字段作为关键字参数的属性。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐