Odoo 13 能否基于状态控制表单视图中Notebook页面的显隐?
需求实现可行性说明
你提出的notebook页面按业务状态自动显隐的需求完全可以实现,属于Odoo表单视图的原生支持能力,不需要开发复杂的前端自定义逻辑。
核心实现原理
Odoo表单的所有视图元素(包括notebook下的页面节点)都支持绑定模型字段值做实时的显隐响应,只要你定义的4个业务状态是模型上持久存储的字段(一般为fields.Selection类型),就可以直接通过视图配置完成控制。
具体配置方法
找到你需要控制的notebook页面节点,根据你习惯的Odoo13兼容写法,添加对应的显隐规则即可,两种写法效果完全一致:
- 全版本兼容的
attrs写法(稳定性最强,适配从Odoo 10到Odoo 13的所有版本)
给page节点添加绑定规则,当状态字段值不属于状态1、状态2的范围时,自动隐藏当前页面:<page string="需控制显隐的业务页面" attrs="{'invisible': [('你的状态字段名', 'notin', ['状态1的存储值', '状态2的存储值'])]}"> <!-- 页面原有的字段、布局内容 --> </page> - Odoo13原生支持的简化表达式写法
直接在page节点上添加invisible属性做表达式绑定,代码更简洁:<page string="需控制显隐的业务页面" invisible="你的状态字段名 not in ('状态1的存储值', '状态2的存储值')"> <!-- 页面原有的字段、布局内容 --> </page>
交互效果与常见注意事项
- 这种绑定是完全响应式的:不管状态值是通过点击向导按钮触发业务逻辑回写更新,还是用户手动在界面上切换状态,只要状态字段值发生变化,notebook页面的显隐会立刻自动更新,不需要额外写JS监听逻辑。
- 如果你提到的交互是“点击向导按钮弹出弹窗完成操作后,再切换对应业务状态”,这个显隐逻辑会在向导关闭、主表单的状态字段值刷新时自动触发,不需要额外对接弹窗的关闭事件。
- 配置时注意两个易踩坑点:
- 绑定规则里填写的是状态字段的实际存储值(也就是Selection定义里元组的第一个元素,比如
'draft'、'confirmed'这类),不要填前端展示的中文文本,否则会出现规则不生效的问题。 - 显隐规则要配置在具体的
<page>节点上,不要配置在最外层的<notebook>根节点上,否则会把整个notebook的所有页面都隐藏。
- 绑定规则里填写的是状态字段的实际存储值(也就是Selection定义里元组的第一个元素,比如
内容的提问来源于stack exchange,提问作者Leon Nguyen
相关产品推荐
相关产品推荐

