能否动态控制Odoo选择字段选项?基于vt_flag筛选可选值
动态切换Selection字段选项的实现方案
这个需求完全可行,以下是两种实用的实现方式:
方法一:模型层动态生成选项
将Selection字段的选项来源改为动态方法,根据当前记录的vt_flag值返回对应选项列表,同时通过onchange方法触发字段刷新,确保选项实时更新。
代码实现
from odoo import models, fields, api class YourModel(models.Model): _name = 'your.model.name' # 替换为你的模型名称 vt_invoice_type_dinamic = fields.Selection( selection='_get_dynamic_invoice_types', string='Siat invoice type' ) vt_flag = fields.Boolean(string='Flag for dynamic invoice', default=False) def _get_dynamic_invoice_types(self): # 基础选项列表(vt_flag为True时显示) basic_options = [('1', 'Sale'), ('2', 'Education')] # 若vt_flag为False,追加剩余选项 if not self.vt_flag: basic_options.extend([('14', 'Services'), ('22', 'Invoice WA')]) return basic_options @api.onchange('vt_flag') def _onchange_vt_flag(self): # 清空不在新选项范围内的无效值(可选) if self.vt_flag and self.vt_invoice_type_dinamic in ['14', '22']: self.vt_invoice_type_dinamic = False # 返回domain触发选项刷新 valid_ids = [opt[0] for opt in self._get_dynamic_invoice_types()] return {'domain': {'vt_invoice_type_dinamic': [('id', 'in', valid_ids)]}}
方法二:视图层结合Domain控制选项
如果不想修改字段的核心定义,可以通过视图的attrs结合onchange方法,在前端层面限制可选项。
步骤1:模型层添加onchange方法
from odoo import models, fields, api class YourModel(models.Model): _name = 'your.model.name' # 替换为你的模型名称 vt_invoice_type_dinamic = fields.Selection([ ('1', 'Sale'), ('2', 'Education'), ('14', 'Services'), ('22', 'Invoice WA'), ], string='Siat invoice type') vt_flag = fields.Boolean(string='Flag for dynamic invoice', default=False) @api.onchange('vt_flag') def _onchange_vt_flag(self): if self.vt_flag: # 限制选项为前两个 valid_ids = ['1', '2'] # 清除无效选中值 if self.vt_invoice_type_dinamic not in valid_ids: self.vt_invoice_type_dinamic = False else: # 允许所有选项 valid_ids = ['1', '2', '14', '22'] return {'domain': {'vt_invoice_type_dinamic': [('id', 'in', valid_ids)]}}
步骤2:视图层配置attrs
在对应表单视图的字段定义中添加attrs属性,实现动态domain控制:
<field name="vt_invoice_type_dinamic" attrs="{'domain': [('id', 'in', ['1','2'])]}" />
两种方法对比
- 方法一从模型根源生成选项,逻辑更严谨,适用于需要全局统一控制选项的场景;
- 方法二通过前端视图控制,修改更灵活,适合快速调整需求且不想改动字段核心定义的场景。
内容的提问来源于stack exchange,提问作者Oscar Vardela
相关产品推荐
相关产品推荐

