Flask WTForms中SelectField表单报错Not a vaild choice解析

时间:2025-05-07 13:13:32

关于这个问题,是我在看了源码之后才发现的

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的选项。