Odoo视图继承

By jeffery

   

掌握了视图继承,就不再大量复制视图代码,按不同的目的将视图划分不同的层,在这些层之间灵活运用继承,简单有效的管理视图

   

Odoo视图 通过 inherit_id 和 mode 字段 来确定 视图的继承路径

   

Mode 有 2个选项, primary 和 extension,表明当前 视图是 扩展视图,还是 基本视图

   

如果 指定了 inherit_id,则 Mode 默认是 extension, 但可以 明确指定为 primary

如果 没有 指定 inherit_id,则 Mode 是 primary

   

视图模式矩阵

inherit_id

mode

真实视图模式

备注

True

Primary

基本视图

引用父视图的完整视图

True

False

扩展视图

改写父视图

False

Primary

基本视图

  

False

False

基本视图

  

True

Extension

扩展视图

改写父视图

False

Extension

扩展视图

违反 SQL约束

  

  

  

  

   

对于 基本视图,如果指定了 inherit ID,则 先取得 完整父视图,应用 视图继承规范,改扩展父视图,然后 合并当前视图的全部扩展视图 ; 如果 没有指定 inherit ID,则使用 当前视图定义,并 合并当前视图的全部扩展视图

   

对于 扩展视图,则 扩展父视图,对父视图进行修改;通常情况下,action window指向 基本视图,如果 action window 指向了 扩展视图,则 自动解析为 扩展视图 继承关系最近的 父基本视图

   

视图继承示意图如下

   

<<Odoo view inheritance.drawio>>

   

   

一共有 3个 基本视图: view 1,view 2, view 3, view 2 继承 view1 。

   

1, 解析 View 2 时, 将在 view 1 的完整视图 上,应用 view 2 的视图继承规范,同时 合并 view 2 的扩展视图; view 1 的完整视图,是指 view 1 视图 和 扩展视图 的合并

   

2, 扩展 视图 View 1.1 被 action window调用,解析该动作的视图时,将 view 1 的完整视图 返回给 该动作, 因为view 1 是距离 view 1.1 最近的基本视图

   

   

Odoo 产品 视图 使用了复杂的继承关系

   

例如, 产品的搜索视图,在不同的App,只需要显示该 App需要的 过滤器

product

  

   

Stock

  

  

MRP

  

  

玩法:

将 视图划分不同的层,其中 product.product_template_search_view 是 基础视图,作为复用的 公共部分, 然后在 各 App 定义 基本视图,使用 inherit ID 引用 公共视图

   

   

例如,需要对 res.partner 视图 按行业 "公司、餐馆" 进行 区分

   

为 公司 定义 基本视图, 它基于 通用 公司视图进行的扩展

   

   

为 餐馆 定义 基本视图, 它也是基于 通用 公司视图 进行的扩展

   

   

最后,为 不同行业的入口,即 action 绑定相应的视图

   

jeffery 2024年4月23日
标签
存档
Odoo库存规则