视图记录

视图定义了记录应如何呈现给最终用户。它们以 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:

  1. 如果视图有父视图,则先完整解析父视图,然后应用当前视图的继承规范;

  2. 如果视图没有父视图,则直接使用其 arch;

  3. 查找当前视图中模式为 extension 的子视图,并以深度优先方式应用它们的继承规范(先应用子视图,再应用其子视图,然后应用其兄弟视图)。

继承按照 inherit_id 字段应用。如果多个视图记录继承同一个视图,则顺序由 priority 决定。

应用子视图后的结果即为最终的 arch。

继承规范

继承规范按顺序应用,由以下部分组成:

  1. 用于匹配父视图中被继承元素的元素定位器;

  2. 用于修改被继承元素的子元素。

元素定位器有以下三种类型:

  • 带有 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>

模型通用部分