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

Odoo 15无法为已有Selection字段添加选项问题求助

解决Odoo 15中动态修改Selection字段选项的问题

问题场景

在Odoo 15中定义了两个Selection字段:

x = fields.Selection([('x A','x A'),('x B','x B')],string='X')
y = fields.Selection([('0','0')],string='Y')

尝试通过onchange方法为y字段添加选项,代码如下:

@api.onchange('x')
def onchange_x(self):
    self.y = fields.Selection(selection_add = [('y A', 'y A'),('y B', 'y B')])

选择x字段选项时触发错误:

ValueError: Wrong value for hr.employee.y: <odoo.fields.Selection>

错误原因

代码中self.y = fields.Selection(...)的写法完全错误:y字段存储的是选项对应的字符串值(如'0'),但你却将一个字段定义对象赋值给它,类型不匹配直接触发报错。

解决方法

方法一:动态Selection字段定义(推荐)

将y字段的selection参数设置为可调用方法,根据当前记录的x值动态返回选项列表:

from odoo import models, fields, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    x = fields.Selection([('x A','x A'),('x B','x B')], string='X')
    
    def _get_y_options(self):
        # 根据x的取值返回对应选项
        if self.x:
            return [('0','0'), ('y A', 'y A'), ('y B', 'y B')]
        return [('0','0')]
    
    y = fields.Selection(selection='_get_y_options', string='Y')

方法二:onchange中动态更新字段选项并刷新视图

如果必须通过onchange实现,可以修改字段的selection属性并触发视图重载:

from odoo import models, fields, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    x = fields.Selection([('x A','x A'),('x B','x B')], string='X')
    y = fields.Selection([('0','0')], string='Y')

    @api.onchange('x')
    def onchange_x(self):
        # 更新y字段的选项列表
        if self.x:
            self._fields['y'].selection = [('0','0'), ('y A', 'y A'), ('y B', 'y B')]
        else:
            self._fields['y'].selection = [('0','0')]
        # 返回视图重载指令,让前端刷新y字段
        return {
            'type': 'ir.actions.client',
            'tag': 'reload',
        }

注意:方法二直接修改模型级别的字段属性,会影响所有记录。如果需要仅对当前记录生效,优先使用方法一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:10:33