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 } }
关键说明
- 返回字段更新字典:通过
'fields'键指定要更新的字段属性,这里修改column_name的selection为新的列名列表,Odoo会自动更新表单中的下拉选项。 - 清空当前值:使用
'value'键将column_name重置为False,避免保留之前选择的、现在可能无效的列名。 - 简化代码:移除了冗余的
columnlist变量,直接使用get_column_names返回的结果即可。
内容的提问来源于stack exchange,提问作者Ketu Patel
相关产品推荐
相关产品推荐

