You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:30:52