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

Odoo中One2many字段视图属性随Selection切换不生效的优化方案咨询

针对你遇到的Odoo向导中One2many字段属性切换不刷新的问题,给你一套更简洁的优化方案,不用新增冗余字段就能解决:

更优实现方案:动态控制One2many字段属性

核心解决思路

利用Odoo原生的字段动态属性绑定和视图上下文联动,结合模型层的onchange逻辑,直接实现Type切换时Route字段的权限控制,避免冗余字段带来的复杂度。

1. 模型层逻辑优化

不用新增额外字段,直接在onchange_type方法里处理默认路由的填充,同时确保切换Type时逻辑触发:

class YourWizard(models.TransientModel):
    _name = 'your.wizard'
    _description = 'Your Wizard'

    type = fields.Selection([('type1', 'Type 1'), ('type2', 'Type 2')], string='Type', required=True)
    route_ids = fields.One2many('your.route.model', 'wizard_id', string='Routes')

    @api.onchange('type')
    def onchange_type(self):
        if self.type == 'type2':
            # 先清空现有路由,再填充系统默认值
            self.route_ids = [(5, 0, 0)]
            default_routes = self._get_default_routes()
            self.route_ids = [(0, 0, vals) for vals in default_routes]
        # Type1时保留原有记录,或按需清空,自行调整

    def _get_default_routes(self):
        # 自定义方法返回默认路由的字典列表
        return [
            {'name': '默认路由1', 'sequence': 1},
            {'name': '默认路由2', 'sequence': 2},
        ]

2. 视图层动态控制权限

在XML视图中,直接给One2many字段和其tree视图绑定动态属性,通过attrs关联Type字段的值,切换时自动刷新状态:

<field name="route_ids" attrs="{'readonly': [('type', '=', 'type2')]}">
    <tree editable="bottom">
        <!-- 动态控制tree的新增/删除按钮显示 -->
        <attribute name="create" attrs="{'invisible': [('type', '=', 'type2')]}"/>
        <attribute name="delete" attrs="{'invisible': [('type', '=', 'type2')]}"/>
        <field name="name"/>
        <field name="sequence"/>
    </tree>
</field>

如果你的Odoo版本对tree标签的attrs支持有限,也可以用fields_view_get动态修改视图属性作为备选:

@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    res = super(YourWizard, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
    if view_type == 'form':
        doc = etree.XML(res['arch'])
        # 获取当前向导的Type值(新建时取默认值,编辑时取当前值)
        current_type = self.env.context.get('default_type') or self.type
        for tree_node in doc.xpath("//field[@name='route_ids']/tree"):
            if current_type == 'type2':
                tree_node.set('create', '0')
                tree_node.set('delete', '0')
            else:
                tree_node.set('create', '1')
                tree_node.set('delete', '1')
        res['arch'] = etree.tostring(doc)
    return res

3. 关键注意点

  • 优先用视图层的attrs绑定方案,更轻量化,符合Odoo原生设计,避免重写fields_view_get。
  • 确保onchange_type方法在Type切换时自动触发,Odoo默认会处理字段变更的onchange事件。
  • Type2时同时控制One2many字段的readonly和tree的create/delete属性,彻底禁止手动修改。

方案优势

  • 无冗余字段,模型结构更简洁,维护成本更低。
  • 视图与模型逻辑联动,切换Type时属性自动刷新,解决之前的状态残留问题。
  • 完全基于Odoo原生能力实现,兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:01:01