Flask中如何向表单类传递数组?遇TypeError错误求助
解决Flask表单中动态传递choices数组的问题
看起来你在动态给Flask-WTF的SelectField设置选项时踩了几个坑,我来帮你一步步梳理并修正这些问题:
1. 表单类的__init__方法错误
你的表单类__init__有两个关键问题:
- 调用父类构造函数的方式不正确,没有传递必要参数也没有绑定当前实例
- 没有动态更新
SelectField的choices属性,而是试图覆盖类变量
修正后的表单类:
from flask_wtf import FlaskForm # 新版本Flask-WTF推荐用FlaskForm替代旧版Form from wtforms import SelectField class livraisonForm(FlaskForm): # 先初始化SelectField,初始choices设为空即可 type_assur = SelectField(u'Type d\'assurance', choices=[]) def __init__(self, list_assurances, *args, **kwargs): # 正确调用父类构造函数,传递所有参数 super(livraisonForm, self).__init__(*args, **kwargs) # 动态给SelectField设置选项 self.type_assur.choices = list_assurances
2. get_assurances函数的错误
你用了fetchone()只会获取数据库的一行数据,而我们需要所有匹配的行,应该换成fetchall()。另外要确保返回格式符合SelectField要求:是(value, label)格式的元组列表。
修正后的函数:
def get_assurances(): cur = mysql.get_db().cursor() try: result = cur.execute("SELECT ID_ASSURANCE, DESCRIPTION FROM type_assurance ") if result > 0: # 获取所有查询结果行 data = cur.fetchall() # 转换为SelectField需要的格式,将ID转为字符串避免类型问题 return [(str(i[0]), i[1]) for i in data] # 无数据时返回默认选项 return [('-', u'Aucune assurance trouvée')] finally: # 用finally确保游标一定会被关闭,避免资源泄漏 cur.close()
3. 视图函数中表单实例化的参数顺序错误
你原来的代码把request.form放在了自定义参数前面,但表单__init__的第一个参数是list_assurances,需要调整顺序:
修正后的视图函数:
def add_livraison(): # 先获取保险列表,再传递给表单 assurances_list = get_assurances() form = livraisonForm(assurances_list, request.form) # 后续可添加表单验证逻辑,比如: # if form.validate_on_submit(): # # 处理表单提交逻辑 return render_template('your_template.html', form=form)
错误原因复盘
TypeError: 'UnboundField' object is not callable:因为父类构造函数未正确调用,导致表单字段没有被绑定到实例,变成了未绑定的字段对象,无法正常使用。- 数据库cursor问题:之前的代码中游标可能没有被正确关闭,用
finally块确保游标关闭可以避免这类资源泄漏问题。
内容的提问来源于stack exchange,提问作者Sabah HM
相关产品推荐
相关产品推荐

