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
相关产品推荐
相关产品推荐

