能否根据条件激活Odoo Notebook的第二/第三页而非默认第一页?
Odoo Notebook 按条件切换默认激活页
实现方案
以下两种方式可满足「默认激活第二页,勾选布尔字段A保持第二页,勾选布尔字段B切换到第三页」的需求:
方案一:模型字段绑定(推荐)
通过ORM字段存储当前激活页签,配合onchange逻辑动态更新,支持记录保存后保留页签状态。
- 模型层代码
在对应业务模型中添加字段与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 # 默认回到第二页
- 视图层配置
在表单视图中,将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
相关产品推荐
相关产品推荐

