flask动态设置SelectedField时验证失败

有个下拉列表,是通过数据库取的值,但是提交的时候validate_on_submit一直返回的是False

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

class PushForm(FlaskForm):

shops = SelectField("店铺", choices=[])
submit = SubmitField("推单")

form = PushForm()
shops = Shop.query.all()
shop_dict = [(s.id, s.name) for s in shops]
form.shops.choices += shop_dict

if request.method == "GET":
return render_template("push/get.html", form=form)

if request.method == "POST":
# 推单
if form.validate_on_submit():
pass
return render_template("push/get.html", form=form)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form method="post" enctype="multipart/form-data">
{{form.hidden_tag()}}
<div class="box-header with-border">
{% include 'message.html' %}
{% if form.errors %}
{{ form.errors }}
{% endif %}
</div>

<div class="box-body">
<div class="form-group">
<label>请选择一个店铺</label>
{{form.shops(class_="form-control select2",placeholder="请选择一个要推单的店铺")}}
</div>
</div>

<div class="box-footer">
<div class="col-md-12">
{{form.submit(class_="btn btn-primary pull-right")}}
</div>
</div>

</form>

按照网上的排错顺序:

  • Form表单中已经加入了csrf_token
  • form对象的choices也已经设置

在页面上打印出错误日志,显示:

1
['Not a valid choice']}

后来查到,原因可能是我的choice第一个参数是int类型,而SelectedField默认会把int转换成str,所以才会显示无效的选项。

解决方案就是在SelectedField中加入关键字coerce

1
coerce=int
你的支持我的动力