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

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

class SelectField(SelectFieldBase):
    widget = widgets.Select()

    def __init__(self, label=None, validators=None, coerce=text_type, choices=None, **kwargs):
        super(SelectField, self).__init__(label, validators, **kwargs)
        self.coerce = coerce
        self.choices = copy(choices)

    def iter_choices(self):
        for value, label in self.choices:
            yield (value, label, self.coerce(value) == self.data)

    def process_data(self, value):
        try:
            self.data = self.coerce(value)
        except (ValueError, TypeError):
            self.data = None

    def process_formdata(self, valuelist):
        if valuelist:
            try:
                self.data = self.coerce(valuelist[0])
            except ValueError:
                raise ValueError(self.gettext('Invalid Choice: could not coerce'))

    def pre_validate(self, form):           #预验证函数
        for v, _ in self.choices:
            if self.data == v:
                break
        else:
            raise ValueError(self.gettext('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的选项。

发布了13 篇原创文章 · 获赞 30 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览