视图记录

视图定义了记录应如何向最终用户展示。它们以 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[源代码]
name

仅在某种列表中查找视图时作为助记符/描述有用。大多数 Odoo 视图名称以插件名称开头,并以讨论的视图类型结尾。

要求

可选

类型

Char

model

与视图关联的模型(如适用)。

要求

必填

类型

Char

arch

根据 视图类型 的视图布局描述。

要求

可选

类型

Text

groups_id

允许使用/访问当前视图的用户组。

如果视图扩展了现有视图,则仅为具有访问权限的用户提供扩展功能(基于提供的 groups_id)。

要求

可选

类型

Many2many -> Groups

priority

通过指定 modeltype 请求视图时,将返回优先级最低的匹配视图(即默认视图)。

它还定义了在 视图解析 期间应用视图的顺序。当通过 id 请求视图且其模式不是 primary 时,将匹配其最近的父视图(mode = primary)。

要求

可选

类型

Integer

inherit_id

对将应用 继承 的父视图的引用。其值默认使用。通过 ref 属性指定父视图,格式为 ref="ADDON.MODEL_parent_view_TYPE"

如果继承是在同一模块中的记录上完成的,则插件名称(点号前的部分)不是必需的。

更多信息,请参见 继承

要求

可选

类型

Many2one

mode

仅在该视图继承自其他视图时适用(即设置了 inherit_id)。

extension

如果请求了该视图,则会查找最近的主视图(通过 inherit_id)。然后,所有基于此模型继承自它的视图都会被应用。

primary

最近的主视图会被完全解析(即使它使用了与当前模型不同的模型)。然后,应用视图的 继承规范 ,结果将作为该视图的实际架构使用。

一种需要在使用 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_idmode 字段决定了 视图解析xpathNODE 元素指示了 继承规范exprposition 属性指定了 继承位置

视图解析

解析按照以下步骤生成请求/匹配的 primary 视图的最终 arch

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

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

  3. 查找当前视图中模式为 extension 的子视图,并按深度优先顺序应用其继承规范(先应用子视图,再应用其子视图,最后应用其兄弟视图)。

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

应用子视图的结果生成最终的 arch

继承规范

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

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

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

元素定位器有三种类型:

  • 一个带有 expr 属性的 xpath 元素。expr 是应用于当前 archXPath 表达式1,匹配找到的第一个节点;

  • 一个带有 name 属性的 field 元素,匹配具有相同 name 的第一个字段。

    注解

    所有其他属性将被忽略。

  • 任何其他元素,匹配具有相同 name 和相同属性的第一个元素。

    注解

    属性 positionversion 被忽略。

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 命名的属性值,以考虑 addremove 和可选的 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 属性,其值可以是 insidereplaceafterbefore

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(其他上下文值不能使用)。

参数
  • view_id (int) – 视图的 ID 或 None

  • view_type (str) – 如果 view_id 为 None,则返回的视图类型(’form’、’list’ 等)

  • options (dict) – 返回附加功能的布尔选项:- bool mobile:如果 Web 客户端当前使用响应式移动视图(用于在 x2many 字段中使用看板视图而不是列表视图),则为 true

返回

请求视图的组成(包括继承的视图和扩展)

返回类型

dict

引发
  • AttributeError

    • 如果继承的视图具有未知位置,而不是 ‘before’、’after’、’inside’、’replace’

    • 如果在父视图中找到除 ‘position’ 以外的其他标签

  • Invalid ArchitectureError – 如果结构中定义了除表单、列表、日历、搜索等之外的视图类型