调试Flask-WTF表单提交报错:AttributeError: 'list'对象无'match'属性
解决Flask-WTF中
validate_on_submit()抛出的AttributeError: 'list' object has no attribute 'match'问题 看你的错误堆栈和代码,我马上就定位到问题了——你在使用Regexp验证器的时候传错了参数类型,导致WTForms试图调用列表的match方法,这显然行不通。
问题根源
在FormVendor类的adr_postal_code字段里,你把正则表达式放在了一个列表里传给Regexp:
adr_postal_code = IntegerField('Postal Code', validators=[DataRequired(), InputRequired(),Regexp(['([1-468][0-9]|[57][0-7]|9[0-6])[0-9]{2}'])])
Regexp验证器的第一个参数需要是字符串形式的正则表达式,或者已经用re.compile()编译好的正则对象。你用方括号把正则包起来,相当于传递了一个列表给它,而列表根本没有match方法,这就是报错的直接原因。
修复步骤
把正则表达式从列表里拿出来,直接传字符串就行,建议加个r前缀表示原始字符串,避免转义问题:
adr_postal_code = IntegerField('Postal Code', validators=[DataRequired(), Regexp(r'([1-468][0-9]|[57][0-7]|9[0-6])[0-9]{2}')])
顺便给你提几个额外的优化点:
DataRequired和InputRequired是完全等价的(WTForms 2.0+里InputRequired就是DataRequired的别名),留一个就够了,不用重复添加;adr_line2用IntegerField不太合理,地址第二行通常可能包含字母、符号或者为空,换成StringField更符合实际使用场景;- 文件字段用
DataRequired可能不够严谨,建议导入FileRequired验证器,确保用户确实上传了文件,示例如下:from wtforms.validators import FileRequired # ... id_front = FileField('ID Front', validators=[DataRequired(), FileRequired()])
验证修复效果
改完之后重启程序,再提交表单,validate_on_submit()就能正常执行验证逻辑了。如果还有其他问题,别忘了查看form.errors的输出,它会详细列出每个字段的验证失败原因,帮你进一步排查问题。
内容的提问来源于stack exchange,提问作者Roderick Jonsson
相关产品推荐
相关产品推荐

