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

能否动态控制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:53:11