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 绑定相应的视图