关于这个问题,是我在看了源码之后才发现的
class SelectField(SelectFieldBase):
widget = ()
def __init__(self, label=None, validators=None, coerce=text_type, choices=None, **kwargs):
super(SelectField, self).__init__(label, validators, **kwargs)
= coerce
= copy(choices)
def iter_choices(self):
for value, label in :
yield (value, label, (value) == )
def process_data(self, value):
try:
= (value)
except (ValueError, TypeError):
= None
def process_formdata(self, valuelist):
if valuelist:
try:
= (valuelist[0])
except ValueError:
raise ValueError(('Invalid Choice: could not coerce'))
def pre_validate(self, form): #预验证函数
for v, _ in :
if == v:
break
else:
raise ValueError(('Not a valid choice'))
可以看到这里有个pre_validate()类方法,这个pre_应该就是后端响应(下面代码)前端提交按钮后会自动触发的格式,和validate_一样
if form.validate_on_submit():
我们来看这个这个预验证函数,发现内容很简单,就是验证当前选择值是否能在我在后端定义表单时赋的choices值里被找到。找不到就报错Not a vaild choice。
一般你如果没有用javaScript重写前端表单的option,且这个option 的value值在你的后端定义的choices里面是不会报这个错的。
所以出现这种问题解决的方法就是看看你后端表单中的choices是不是包含表单提交时当前option的选项。