视图记录¶
视图定义了记录应如何向最终用户展示。它们以 XML 形式指定并作为记录存储,这意味着它们可以独立于其所表示的模型进行编辑。它们非常灵活,允许对所控制的界面进行高度自定义。存在多种 视图类型,每种类型代表一种可视化模式:表单、列表、看板 等。
通用结构¶
基本视图通常共享以下定义的通用最小结构。占位符以全大写表示。
<record id="ADDON.MODEL_view_TYPE" model="ir.ui.view">
<field name="name">NAME</field>
<field name="model">MODEL</field>
<field name="arch" type="xml">
<VIEW_TYPE>
<views/>
</VIEW_TYPE>
</field>
</record>
视图类型¶
- 表单
显示和编辑单个记录的数据。
- 列表
查看和编辑多个记录。
- 搜索
应用过滤器并执行搜索。结果会显示在当前的列表、看板等视图中。
- 看板
以“卡片”形式显示记录,可配置为小型模板。
- QWeb
用于报表、网站等的模板引擎…
- 图表
可视化多个记录或记录组的聚合数据。
- 透视表
以 透视表 形式显示聚合数据。
- 日历
以日、周、月或年的日历形式显示记录为事件。
- 队列分析 Enterprise feature
显示并理解某些数据在一段时间内的变化方式。
- 甘特图 Enterprise feature
以甘特图形式显示记录。
- 网格 Enterprise feature
在数值单元格中显示计算信息;几乎不可配置。
- 地图 Enterprise feature
在地图上显示记录及它们之间的路线。
字段¶
视图记录公开了多个字段。
- class odoo.addons.base.models.ir_ui_view.View[源代码]¶
-
- groups_id¶
允许使用/访问当前视图的用户组。
如果视图扩展了现有视图,则仅为具有访问权限的用户提供扩展功能(基于提供的
groups_id
)。- 要求
可选
- 类型
Many2many
->Groups
- priority¶
通过指定
model
和type
请求视图时,将返回优先级最低的匹配视图(即默认视图)。它还定义了在 视图解析 期间应用视图的顺序。当通过
id
请求视图且其模式不是primary
时,将匹配其最近的父视图(mode
=primary
)。- 要求
可选
- 类型
- inherit_id¶
对将应用 继承 的父视图的引用。其值默认使用。通过
ref
属性指定父视图,格式为ref="ADDON.MODEL_parent_view_TYPE"
。如果继承是在同一模块中的记录上完成的,则插件名称(点号前的部分)不是必需的。
更多信息,请参见 继承 。
- 要求
可选
- 类型
- mode¶
仅在该视图继承自其他视图时适用(即设置了
inherit_id
)。- extension¶
如果请求了该视图,则会查找最近的主视图(通过
inherit_id
)。然后,所有基于此模型继承自它的视图都会被应用。
一种需要在使用
inherit_id
时覆盖mode
的情况是委托继承。在这种情况下,派生模型与其父模型分离,并且匹配一个模型的视图不会匹配另一个模型。假设从与父模型关联的视图继承,并希望自定义派生视图以显示派生模型的数据,则需要将派生视图的mode
设置为primary
,因为它是该派生模型的基础(也可能是唯一的)视图。否则,视图匹配 规则将不适用。更多信息,请参见 继承 。
- 要求
可选
- 类型
Selection
:扩展
/主视图
- 默认值
扩展
注解
当前上下文和用户访问权限也可能影响视图的功能。
继承¶
继承允许自定义交付的视图。例如,它可以在安装模块时添加内容,或者根据操作提供不同的显示方式。
继承视图通常共享以下定义的通用结构。占位符以全大写表示。此合成视图将更新由 XPath 定位的节点,以及由名称和属性定位的另一个节点。
<record id="ADDON.MODEL_view_TYPE" model="ir.ui.view">
<field name="model">MODEL</field>
<field name="inherit_id" ref="VIEW_REFERENCE"/>
<field name="mode">MODE</field>
<field name="arch" type="xml">
<xpath expr="XPATH" position="POSITION">
<CONTENT/>
</xpath>
<NODE ATTRIBUTES="VALUES" position="POSITION">
<CONTENT/>
</NODE>
</field>
</record>
inherit_id
和 mode
字段决定了 视图解析。xpath
或 NODE
元素指示了 继承规范。expr
和 position
属性指定了 继承位置。
视图解析¶
解析按照以下步骤生成请求/匹配的 primary
视图的最终 arch
:
如果视图有父视图,则先完全解析父视图,然后应用当前视图的继承规范;
如果视图没有父视图,则直接使用其
arch
;查找当前视图中模式为
extension
的子视图,并按深度优先顺序应用其继承规范(先应用子视图,再应用其子视图,最后应用其兄弟视图)。
继承根据 inherit_id
字段应用。如果有多个视图记录继承同一个视图,则顺序由 priority
决定。
应用子视图的结果生成最终的 arch
。
继承规范¶
继承规范按顺序应用,由以下部分组成:
一个元素定位器,用于匹配父视图中的继承元素;
子元素用于修改继承的元素。
元素定位器有三种类型:
一个带有
expr
属性的xpath
元素。expr
是应用于当前arch
的 XPath 表达式1,匹配找到的第一个节点;一个带有
name
属性的field
元素,匹配具有相同name
的第一个字段。注解
所有其他属性将被忽略。
任何其他元素,匹配具有相同
name
和相同属性的第一个元素。注解
属性
position
和version
被忽略。
- 1
为简化 QWeb 视图中的匹配,添加了一个扩展函数:
hasclass(*classes)
在上下文节点具有所有指定类时匹配。
Example
<xpath expr="page[@name='pg']/group[@name='gp']/field" position="inside">
<field name="description"/>
</xpath>
<div name="name" position="replace">
<field name="name2"/>
</div>
继承位置¶
继承规范接受一个可选的 position
属性,默认值为 inside
,用于指定如何修改匹配的节点。
- inside¶
继承规范的内容被追加到匹配的节点中。
Example
<notebook position="inside"> <page string="New feature"> ... </page> </notebook>
- after¶
继承规范的内容被追加到匹配节点之后的父节点中。
Example
<xpath expr="//field[@name='x_field']" position="after"> <field name="x_other_field"/> </xpath>
- before¶
继承规范的内容被追加到匹配节点之前的父节点中。
Example
<field name=x_field" position="before"> <field name="x_other_field"/> </field>
- replace¶
继承规范的内容替换匹配的节点。规范内容中仅包含
$0
的任何文本节点将被匹配节点的副本替换,从而有效包裹匹配的节点。Example
<xpath expr="//field[@name='x_field']" position="replace"> <div class="wrapper"> $0 </div> </xpath>
- attributes¶
继承规范的内容应仅由
attribute
元素组成,每个元素都有一个name
属性和一个可选的主体。如果
attribute
元素有主体,则会以name
命名的新属性添加到匹配节点中,并将其值设置为attribute
元素的文本内容。如果
attribute
元素没有主体,则以其name
命名的属性将从匹配节点中移除。如果
attribute
元素具有add
属性、remove
属性或两者兼具,则重新计算匹配节点中以name
命名的属性值,以考虑add
、remove
和可选的separator
属性(默认为,
)的值。add
包含其值(由separator
分隔)。remove
移除其值(由separator
分隔)。
Example
<field name="x_field" position="attributes"> <attribute name="invisible">True</attribute> <attribute name="class" add="mt-1 mb-1" remove="mt-2 mb-2" separator=" "/> </field>
- move¶
在继承规范的内容上设置属性
position="move"
,以指定节点相对于继承规范的元素定位器如何移动。元素定位器上还必须设置position
属性,其值可以是inside
、replace
、after
或before
。Example
<xpath expr="//@target" position="after"> <xpath expr="//@node" position="move"/> </xpath> <field name="target_field" position="after"> <field name="my_field" position="move"/> </field>
模型通用¶
- class odoo.addons.base.models.ir_ui_view.View[源代码]
- Model.get_views(views, options=None)¶
返回给定视图的 fields_views,以及当前模型的字段,并可选地返回针对给定操作的过滤器。
方法的返回值只能依赖于请求的视图类型、访问权限(视图或其他记录)、视图访问规则、选项、上下文语言和 TYPE_view_ref(其他上下文值不能使用)。
包含在视图中或表示域(在 Python 字段上)的 Python 表达式将由客户端使用所有上下文值以及其拥有的记录值进行评估。
- 参数
views – 视图 ID 和视图类型的列表 [view_id, view_type]
options (dict) – 一个字典,包含可选布尔标志,用于启用以下功能:
toolbar
加载 fields_views 时包括上下文操作load_filters
返回模型的过滤器action_id
获取过滤器的操作 ID,否则加载全局过滤器或模型过滤器
- 返回
包含 fields_views、字段以及可选过滤器的字典
- Model.get_view([view_id | view_type='form'])¶
获取请求视图的详细组成,例如模型和视图架构。
方法的返回值只能依赖于请求的视图类型、访问权限(视图或其他记录)、视图访问规则、选项、上下文语言和 TYPE_view_ref(其他上下文值不能使用)。
- 参数
- 返回
请求视图的组成(包括继承的视图和扩展)
- 返回类型
- 引发
如果继承的视图具有未知位置,而不是 ‘before’、’after’、’inside’、’replace’
如果在父视图中找到除 ‘position’ 以外的其他标签
Invalid ArchitectureError – 如果结构中定义了除表单、列表、日历、搜索等之外的视图类型