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

Odoo选择表名后下拉框显示对应列名脚本报错求助

解决Odoo动态更新下拉列名的AttributeError问题

错误原因

你遇到的AttributeError: 'bool' object has no attribute 'selection'是因为self.column_name返回的是该字段的当前值(未选择时为False,布尔类型),而非字段对象本身。直接试图修改它的selection属性是无效的。

修正代码

要动态更新column_name的下拉选项,需要在onchange方法中返回一个字典,用来更新字段的选择项和当前值:

table_name = fields.Selection(
    [('res_partner', 'Contacts'), ('res_company', 'Companies')], string='Table Name',
    tracking=True, required=True)

column_name = fields.Selection([], string='Column Name')

@api.model
def get_column_names(self, table_name):
    query = """
           SELECT column_name
           FROM information_schema.columns
           WHERE table_name = %s
       """
    self.env.cr.execute(query, [table_name])
    result = self.env.cr.fetchall()
    return [(row[0], row[0]) for row in result]

@api.onchange('table_name')
def onchange_table_name(self):
    if self.table_name:
        # 获取对应表的列名列表
        column_options = self.get_column_names(self.table_name)
        # 返回更新字段选择项和清空当前值的字典
        return {
            'fields': {
                'column_name': {
                    'selection': column_options
                }
            },
            'value': {
                'column_name': False
            }
        }
    else:
        # 未选择表名时清空列名下拉选项
        return {
            'fields': {
                'column_name': {
                    'selection': []
                }
            },
            'value': {
                'column_name': False
            }
        }

关键说明

  1. 返回字段更新字典:通过'fields'键指定要更新的字段属性,这里修改column_name的selection为新的列名列表,Odoo会自动更新表单中的下拉选项。
  2. 清空当前值:使用'value'键将column_name重置为False,避免保留之前选择的、现在可能无效的列名。
  3. 简化代码:移除了冗余的columnlist变量,直接使用get_column_names返回的结果即可。

内容的提问来源于stack exchange,提问作者Ketu Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:23:19