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

能否根据条件激活Odoo Notebook的第二/第三页而非默认第一页?

Odoo Notebook 按条件切换默认激活页

实现方案

以下两种方式可满足「默认激活第二页,勾选布尔字段A保持第二页,勾选布尔字段B切换到第三页」的需求:

方案一:模型字段绑定(推荐)

通过ORM字段存储当前激活页签,配合onchange逻辑动态更新,支持记录保存后保留页签状态。

  1. 模型层代码
    在对应业务模型中添加字段与onchange方法:
from odoo import models, fields, api

class YourModel(models.Model):
    _name = 'your.model'
    _description = '自定义业务模型'

    boolean_a = fields.Boolean(string="布尔字段A")
    boolean_b = fields.Boolean(string="布尔字段B")
    current_notebook_tab = fields.Integer(string="当前激活页签", default=1)  # 默认第二页(索引从0开始)

    @api.onchange('boolean_a', 'boolean_b')
    def _onchange_boolean_fields(self):
        if self.boolean_b:
            self.current_notebook_tab = 2  # 切换到第三页
        elif self.boolean_a:
            self.current_notebook_tab = 1  # 保持第二页
        else:
            self.current_notebook_tab = 1  # 默认回到第二页
  1. 视图层配置
    在表单视图中,将notebook的current_tab属性绑定到新增字段:
<record id="your_model_form_view" model="ir.ui.view">
    <field name="name">your.model.form.view</field>
    <field name="model">your.model</field>
    <field name="arch" type="xml">
        <form>
            <sheet>
                <group>
                    <field name="boolean_a"/>
                    <field name="boolean_b"/>
                </group>
                <notebook current_tab="current_notebook_tab">
                    <page string="第一页">
                        <!-- 第一页内容区域 -->
                    </page>
                    <page string="第二页">
                        <!-- 第二页内容区域 -->
                    </page>
                    <page string="第三页">
                        <!-- 第三页内容区域 -->
                    </page>
                </notebook>
            </sheet>
        </form>
    </field>
</record>

方案二:前端JS监听(无额外字段)

通过前端JS监听布尔字段变化,直接控制页签切换,适合不需要持久化页签状态的场景。

在表单视图中嵌入JS代码:

<record id="your_model_form_view" model="ir.ui.view">
    <field name="name">your.model.form.view</field>
    <field name="model">your.model</field>
    <field name="arch" type="xml">
        <form>
            <sheet>
                <group>
                    <field name="boolean_a"/>
                    <field name="boolean_b"/>
                </group>
                <notebook>
                    <page string="第一页">
                        <!-- 第一页内容区域 -->
                    </page>
                    <page string="第二页">
                        <!-- 第二页内容区域 -->
                    </page>
                    <page string="第三页">
                        <!-- 第三页内容区域 -->
                    </page>
                </notebook>
            </sheet>
            <script>
            odoo.define('your_module.notebook_switch', function(require) {
                'use strict';
                var FormController = require('web.FormController');

                FormController.include({
                    _renderView: function() {
                        this._super.apply(this, arguments);
                        var self = this;
                        // 初始化默认激活第二页
                        setTimeout(function() {
                            self.$el.find('.o_notebook .o_notebook_page').eq(1).click();
                        }, 100);
                        // 监听布尔字段变化切换页签
                        self.$el.find('field[name="boolean_a"], field[name="boolean_b"]').on('change', function() {
                            var booleanB = self.model.get(self.handle).data.boolean_b;
                            var targetIndex = booleanB ? 2 : 1;
                            self.$el.find('.o_notebook .o_notebook_page').eq(targetIndex).click();
                        });
                    }
                });
            });
            </script>
        </form>
    </field>
</record>

注意事项

  • Odoo notebook页签索引从0开始,第一页对应0、第二页对应1、第三页对应2,需确保索引匹配正确。
  • 方案一的页签状态会持久化到数据库,打开已保存记录时会自动恢复上次的页签;方案二仅在当前会话生效,刷新页面后回到默认设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:16:06