视图记录¶
视图定义了记录应如何呈现给最终用户。它们以 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
在地图上显示记录以及记录之间的路线。
字段¶
视图记录会暴露若干字段。
注解
当前上下文和用户访问权限也可能影响视图的功能。
继承¶
继承可用于自定义随系统提供的视图。例如,它可以在安装模块时添加内容,或根据动作提供不同的显示方式。
继承视图通常共享下文定义的通用结构。占位符以全大写表示。这个示例视图会更新一个由 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)即匹配。
示例
<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¶
继承规格的内容会追加到匹配到的节点上。
示例
<notebook position="inside"> <page string="New feature"> ... </page> </notebook>
- after¶
继承规格的内容会追加到匹配节点的父节点中、位于匹配节点之后。
示例
<xpath expr="//field[@name='x_field']" position="after"> <field name="x_other_field"/> </xpath>
- before¶
继承规格的内容会追加到匹配节点的父节点中、位于匹配节点之前。
示例
<field name=x_field" position="before"> <field name="x_other_field"/> </field>
- replace¶
继承规格的内容会替换匹配到的节点。规格内容中任何仅包含
$0的文本节点都会被替换为匹配节点的副本,从而有效地包裹该匹配节点。示例
<xpath expr="//field[@name='x_field']" position="replace"> <div class="wrapper">$0</div> </xpath>
- attributes¶
继承规格的内容应仅由
attribute元素组成,每个元素带有一个name属性和一个可选的主体。如果
attribute元素有主体,则会以该元素的文本为值,向匹配节点添加一个以其name命名的新属性。如果
attribute元素没有主体,则会从匹配节点中删除以其name命名的属性。如果
attribute元素带有add属性、remove属性或两者兼有,则匹配节点中以其name命名的属性值会被重新计算,以计入add、remove的值以及可选的separator属性(默认为,)。add会将其值加入,并以separator分隔。remove会将其值移除,并以separator分隔。
示例
<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。示例
<xpath expr="//@target" position="after"> <xpath expr="//@node" position="move"/> </xpath> <field name="target_field" position="after"> <field name="my_field" position="move"/> </field>