视图

视图定义了记录向最终用户的展示方式。它们以 XML 编写,因此可以独立于其所表示的模型进行编辑。视图十分灵活,可以高度自定义其所控制的界面。视图有多种类型,每一种都代表一种可视化方式:form、list、kanban 等。

通用结构

基础视图通常共享下文定义的通用结构,占位符以全大写表示。

<record id="MODEL_view_TYPE" model="ir.ui.view">
  <field name="name">NAME</field>
  <field name="model">MODEL</field>
  <field name="arch" type="xml">
    <VIEW_TYPE>
      <VIEW_SPECIFICATIONS/>
    </VIEW_TYPE>
  </field>
</record>

字段

视图对象提供了若干字段。除另有说明外,它们都是可选的。

  • name (必填) Char

    仅作为视图的助记/描述,便于在各类列表中查找视图。

  • model Char

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

  • priority Integer

    当以 (model, type) 请求视图时,会返回匹配该模型和类型且优先级数值最低的视图(即默认视图)。

    它还定义了 视图继承 期间视图的应用顺序。

  • groups_id Many2many -> odoo.addons.base.models.res_users.Groups

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

    若视图扩展已有视图,则仅当用户具有所提供 groups_id 的访问权限时,该扩展才会对该用户生效。

  • arch Text

    视图布局的描述。

属性

不同的视图类型拥有丰富的属性,可用于定制通用行为。这里介绍其中一些主要属性,它们并非对所有视图类型都生效。

Note

当前上下文和用户访问权限也可能影响视图的能力。

  • create

    在视图上禁用/启用记录创建。

  • edit (form & list & gantt)

    禁用/启用视图上的记录编辑。

  • delete (form & list)

    通过 Action 下拉菜单禁用/启用视图中的记录删除功能。

  • duplicate (form)

    通过 动作 下拉菜单启用/禁用视图上的记录复制功能。

  • decoration-{$name} (list & gantt)

    根据相应记录的属性,以行文本样式的形式定义记录的条件显示。

    取值为 Python 表达式。对每条记录,表达式会以记录的属性作为上下文值进行求值,如果结果为 true,则将相应样式应用于该行。以下是上下文中可用的其他一些值:

    • uid:当前用户的 id,

    • today:当前本地日期,格式为 YYYY-MM-DD 的字符串,

    • now:与 today 相同,但还包含当前时间。该值的格式为 YYYY-MM-DD hh:mm:ss。

    <tree decoration-info="state == 'draft'"
        decoration-danger="state == 'help_needed'"
        decoration-bf="state='busy'">
        <!-- TREE_VIEW_CONTENT -->
    </tree>
    

    Warning

    两种视图类型支持的值不同。甘特视图仅支持 success、info、warning、danger 和 secondary 显示样式;列表视图支持 bf、it、success、info、warning、danger、muted 和 primary 显示样式。

  • sample (kanban & list & gantt & graph & pivot & cohort)

    如果当前模型没有记录,则用一组示例记录填充视图。该属性默认为 false。

    这些伪记录会针对某些字段名/模型套用启发式规则。例如,’res.users’ 模型上的 ‘display_name’ 字段会被填入示例人名,而 ‘email’ 字段则呈现为 ‘firstname.lastname@sample.demo’ 的形式。

    用户无法与这些数据交互,并且一旦执行某个操作(创建记录、添加列等),这些数据就会被丢弃。

  • banner_route 需要请求的路由地址,其内容会前置添加到视图之前。

    若设置此属性,将获取 控制器路由 url 并显示在视图上方。控制器的 json 响应应包含 “html” 键。

    如果 html 中包含样式表 <link> 标签,该标签会被移除并追加到 <head> 中。

    要与后端交互,可以使用 <a type=”action”> 标签。详细信息请参阅 AbstractController 的 _onActionClicked 方法的文档(addons/web/static/src/js/views/abstract_controller.js)。

    只有扩展 AbstractView 和 AbstractController 的视图才能使用此属性,如 表单、看板、列表 等…

    示例:

    <tree banner_route="/module_name/hello" />
    
    class MyController(odoo.http.Controller):
        @http.route('/module_name/hello', auth='user', type='json')
        def hello(self):
            return {
                'html': """
                    <div>
                        <link href="/module_name/static/src/css/banner.css"
                            rel="stylesheet">
                        <h1>hello, world</h1>
                    </div> """
            }
    

继承

继承字段

以下两个 View 字段用于指定被继承的视图。

  • inherit_id Many2one

    当前视图的父视图,默认未设置。使用 ref 属性来指定父视图:

    <field name="inherit_id" ref="library.view_book_form"/>
    
  • mode Selection: extension / primary

    继承模式,设置了 inherit_id 时默认为 extension,否则为 primary。

    在使用 inherit_id 的同时需要覆盖 mode 的一个示例是委托继承。此时派生模型与其父模型分离,与父模型匹配的视图不会与派生模型匹配。假设你继承了与父模型关联的视图,并希望自定义派生视图以展示派生模型的数据,则该派生视图的 mode 需要设置为 primary,因为它是该派生模型的基础(也可能是唯一)视图。否则 视图匹配 规则将不适用。

视图匹配

  • 如果以 (model, type) 请求视图,则匹配模型和类型正确、mode=primary 且优先级最低的视图。

  • 当以 id 请求视图时,如果其模式不是 primary,则匹配其模式为 primary 的 最近 父视图。

视图解析

解析过程会为请求/匹配到的 primary 视图生成最终的 arch:

  1. 如果视图有父视图,则先完整解析父视图,再应用当前视图的继承声明

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

  3. 查找当前视图中模式为 extension 的子视图,并以深度优先方式应用它们的继承声明(先应用子视图,再应用其子视图,然后应用其同级视图)

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

继承规范

继承规格由元素定位器和子元素组成:定位器用于在父视图中匹配被继承的元素,子元素用于修改被继承的元素。

用于匹配目标元素的元素定位器共有三种类型:

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

  • 带有 name 属性的 field 元素,匹配第一个具有相同 name 的 field;匹配时会忽略其他所有属性

  • 其他任意元素:匹配第一个名称相同且属性完全一致的元素(忽略 position 和 version 属性)

<xpath expr="page[@name='pg']/group[@name='gp']/field" position="inside">
  <field name="description"/>
</xpath>

<field name="res_id" position="after"/>

<div name="name" position="replace">
  <div name="name2">
    <field name="name2"/>
  </div>
</div>

继承规格可以带有可选的 position 属性,用于指定如何修改匹配到的节点:

inside (默认)

继承声明的内容会被追加到匹配节点上

replace

继承声明的内容会替换匹配节点。声明内容中任何仅包含 $0 的文本节点都会被匹配节点的完整副本替换,从而把匹配节点包裹起来。

after

继承声明的内容会被添加到匹配节点的父节点中,位于匹配节点之后

before

继承声明的内容会被添加到匹配节点的父节点中,位于匹配节点之前

attributes

继承声明的内容应为带有 name 属性以及可选内容体的 attribute 元素:

  • 如果 attribute 元素有内容,则在匹配到的节点上创建一个以其 name 命名的新属性,其值为该 attribute 元素的文本

  • 如果 attribute 元素没有内容,则匹配节点上以其 name 命名的属性会被移除。若不存在该属性,则抛出错误

  • 如果 attribute 元素带有 add 属性、remove 属性或两者都有,则重新计算匹配节点上以 name 命名的属性值,使其包含 add 的值(以 separator 分隔)并删除 remove 的值(以 separator 分隔)。如果未提供 separator,则使用 , 作为分隔符。

<field name="sale_information" position="attributes">
  <attribute name="invisible">0</attribute>
  <attribute name="attrs">
    {'invisible': [('sale_ok', '=', False)], 'readonly': [('editable', '=', False)]}
  </attribute>
  <attribute name="class" add="mt-1 mb-1" remove="mt-2 mb-2" separator=" "/>
</field>
move

可作为继承声明的直接子元素使用,配合取值为 inside、replace、after 或 before 的 position 属性来移动节点。

<xpath expr="//@target" position="after">
    <xpath expr="//@node" position="move"/>
</xpath>

<field name="target_field" position="after">
    <field name="my_field" position="move"/>
</field>

视图的规格(specs)按顺序依次应用。

1

为简化 QWeb 视图中的匹配,额外提供了一个扩展函数:当上下文节点包含所有指定类时 hasclass(*classes) 即匹配成功

模型通用部分

属性

方法

视图类型

活动

活动视图用于展示与记录关联的活动。数据以图表形式展示:记录构成行,活动类型构成列。每行第一个单元格显示一个代表对应记录的卡片(可定制,参见 templates,与 看板 类似)。点击其他单元格时,会显示该记录同类型所有活动的详细描述。

Warning

活动视图仅在安装了 mail 模块时可用,且仅适用于继承自 mail.activity.mixin 的模型。

活动视图的根元素为 <activity>,它接受以下属性:

string 必填)

一个标题,应当描述该视图

视图元素可能的子元素有:

field

声明要在活动 logic (逻辑)中使用的字段。如果字段只是在活动视图中显示,则无需预先声明。

可能的属性有:

name 必填)

要获取的字段名称

templates

定义 QWeb 模板 模板。为清晰起见,卡片的定义可以拆分为多个模板,但活动视图 必须 定义至少一个根模板 activity-box,该模板将为每条记录渲染一次。

活动视图使用大体标准的 javascript qweb,并提供以下上下文变量(参见 看板 了解详情):

widget

当前的 JavaScript 类 ActivityRecord,可用于获取一些元信息。这些方法也可以直接在模板上下文中使用,无需通过 widget 访问

record

一个以所有请求的字段为属性的对象。每个字段都有 value 和 raw_value 两个属性

日历

日历视图将记录作为事件显示在日、周、月或年的日历中。

Note

默认情况下,日历视图将以当前日期(今天)为中心。你可以向动作的上下文传入一个特定的初始日期,以便将日历的初始焦点设为该日期前后的时间段(参见 mode)(使用的上下文键为 initial_date)

其根元素为 <calendar>。日历视图可用的属性有:

date_start 必填)

保存事件开始日期的记录字段名称

date_stop

保存事件结束日期的记录字段名称;如果提供了 date_stop,记录即可直接在日历中拖动(通过拖放)

date_delay

date_stop 的替代方案,提供事件的持续时间而非结束日期(单位:天)

color

用于 color segmentation (颜色分段)的记录字段名称。同一颜色分段中的记录在日历中被分配相同的高亮颜色,颜色的分配是半随机的。在侧边栏中显示可见记录的 display_name/头像

form_view_id

用户创建或编辑事件时打开的视图。注意,如果未设置该属性,日历视图将回退到当前动作中的表单视图 id(如果有的话)。

event_open_popup

如果选项 ‘event_open_popup’ 设置为 true,日历视图将在 FormViewDialog 中打开事件(或记录)。否则,它将在新的表单视图中打开事件(通过 do_action)

quick_add

启用点击快速创建事件:仅要求用户输入 name 该值保存到的字段可通过 rec_name 控制),并尝试仅凭该名称和所点击的事件时间创建新事件。如果快速创建失败,则回退到完整的表单对话框

create_name_field

保存记录文本表示的记录字段名称,在通过“快速创建”机制创建记录时使用

all_day

记录上的布尔字段名称,指示相应事件是否被标记为全天事件(此时持续时间无关紧要)

mode

加载日历时的默认显示模式。可能的取值为:day、week、month、year

scales

以逗号分隔的可用时间刻度列表。默认情况下,所有刻度均可用。可能的刻度值参见 mode。

create, delete

通过将相应属性设置为 false,可在视图中禁用对应的操作

<field>

声明要聚合的字段或要在 kanban logic (逻辑)中使用的字段。如果字段只是简单地显示在日历卡片中。

字段可以具有其他属性:

invisible

使用 “True” 在卡片中隐藏该值

avatar_field

仅用于 x2many 字段,以便在卡片中显示头像而不是 display_name

write_model、write_field 和 filter_field

你可以添加筛选器并将结果保存到所定义的模型中,该筛选器会添加到侧边栏。filter_field 是可选的,用于指定保存筛选器状态的字段。

filters 和 color

使用 “True” 将该字段添加到侧边栏的筛选器中。你可以指定一个 color 字段,用于给复选框着色。

同期群

Enterprise feature

同期群视图用于显示和理解某些数据随时间变化的方式。例如,假设某个企业的客户可以订阅某项服务,同期群视图就可以显示每个月的订阅总数,并研究客户流失率(churn)。点击单元格时,同期群视图会将你重定向到一个新的动作,在该动作中你只能看到该单元格时间区间内包含的记录;该动作包含一个列表视图和一个表单视图。

Note

默认情况下,同期群视图将使用动作中定义的相同列表视图和表单视图。你可以向动作的上下文传入一个列表视图和一个表单视图,以设置/覆盖将要使用的视图(使用的上下文键为 form_view_id 和 list_view_id)

例如,下面是一个非常简单的同期群视图:

<cohort string="Subscription" date_start="date_start" date_stop="date" interval="month"/>

同期群视图的根元素为 <cohort>,它接受以下属性:

string 必填)

一个标题,应当描述该视图

date_start 必填)

一个有效的 date 或 datetime 字段。该视图将此字段理解为记录的开始日期

date_stop 必填)

一个有效的 date 或 datetime 字段。该视图将此字段理解为记录的结束日期。此字段将决定流失率(churn)。

mode 可选)

描述模式的字符串。应为 ‘churn’ 或 ‘retention’(默认)。流失模式从 0% 开始并随时间累积,而留存模式从 100% 开始并随时间递减。

timeline 可选)

描述时间线的字符串。应为 ‘backward’ 或 ‘forward’(默认)。正向时间线显示从 date_start 到 date_stop 的数据,而反向时间线显示从 date_stop 到 date_start 的数据(当 date_start 在未来/大于 date_stop 时)。

interval 可选)

描述时间间隔的字符串。应为 ‘day’、’week’、’month’(默认)或 ‘year’。

measure 可选)

一个可聚合的字段。该字段将用于计算每个单元格的值。如果未设置,同期群视图将统计出现次数。

<field> 可选)

允许指定特定字段以便从可用度量项中对其进行管理,其主要用途是将某个字段从可选择的度量项中隐藏:

name (必填)

视图中要使用的字段名称。

string 可选)

将用于在同期群视图中显示该字段的名称,会覆盖字段默认的 python String 属性。

invisible 可选)

如果为 true,该字段既不会出现在激活的度量项中,也不会出现在可选择的度量项中(适用于聚合后没有意义的字段,例如单位不同的字段,如 € 和 $)。

表单

表单视图用于展示单条记录的数据,其根元素为 <form>。表单视图由常规 HTML 及额外的结构与语义组件构成。

结构组件

结构组件提供结构或“视觉”特性,几乎不含逻辑。它们在表单视图中作为元素或元素集合使用。

notebook

定义一个选项卡区域。每个选项卡通过 page 子元素定义。page 可以有以下属性:

string (必填)

选项卡的标题

accesskey

HTML 的 accesskey 属性

attrs

基于记录值的标准动态属性

Note

注意,notebook 不应放置在 group 之内

group

用于定义表单中的列布局。默认情况下,分组定义 2 列,且分组的大多数直接子元素占据单列。作为分组直接子元素的 field 默认会显示标签,标签与字段本身的 colspan 均为 1。

group 中的列数可通过 col 属性定制,单个元素占据的列数可通过 colspan 定制。

子元素水平排列(先填满下一列再换行)。

分组可以具有 string 属性,显示为分组标题

newline

仅在 group 元素内才有用,会提前结束当前行并立即切换到新行(不会先填充剩余的列)

separator

较小的水平间距,带有 string 属性时表现为章节标题

sheet

可作为 form 的直接子元素使用,以实现更窄且更具响应性的表单布局

header

与 sheet 配合使用,在表单主体自身之上提供一个全宽区域,通常用于显示流程按钮和状态组件

语义组件

语义组件与 Odoo 系统衔接并支持与之交互。可用的语义组件有:

button

调用 Odoo 系统,与 列表视图按钮 类似。此外还可以指定以下属性:

special

对于在对话框中打开的表单视图:save 保存记录并关闭对话框,cancel 关闭对话框但不保存。

confirm

在执行按钮的 Odoo 调用之前显示并等待用户确认的提示信息(在看板视图中同样有效)。

field

渲染当前记录的单个字段(并且可能允许编辑)。支持在表单视图中多次使用同一个字段,且这些字段可以为修饰符 ‘invisible’ 和 ‘readonly’ 设置不同的值。但是,当存在多个字段且其修饰符 ‘required’ 的取值不同时,行为无法得到保证。字段节点可用的属性有:

name (必填)

要渲染的字段名称

id

节点 id。当视图中同一字段出现多次时很有用(参见下文的 label 组件)。默认为字段名称。

widget

字段会根据其类型采用默认的渲染方式(例如 Char、Many2one)。widget 属性允许使用不同的渲染方式和上下文。

options

指定字段组件(包括默认组件)配置选项的 JSON 对象

class

设置在生成元素上的 HTML 类,常见字段类有:

oe_inline

阻止字段后的默认换行,并限制其跨度。

oe_left, oe_right

使字段按对应方向浮动

oe_read_only, oe_edit_only

仅在对应的表单模式下显示该字段

oe_avatar

对于图片字段,将图片以“头像”形式显示(正方形,最大尺寸 90x90,带有一些图片修饰效果)

groups

仅对特定用户显示该字段

on_change

当该字段的值被编辑时调用指定方法,可用于更新其他字段或向用户显示警告

Deprecated since version 8.0: Use odoo.api.onchange() on the model

attrs

根据记录值动态生效的元参数

domain

仅适用于关系字段:显示现有记录以供选择时要应用的筛选器

context

仅适用于关系字段:获取可选值时要传递的上下文

readonly

在只读模式和编辑模式下都显示该字段,但绝不使其可编辑

required

如果字段没有值,则生成错误并阻止保存该记录

nolabel

不自动显示字段的标签,仅当字段是 group 元素的直接子元素时才有意义

placeholder

在 空 字段中显示的帮助信息。在复杂表单中可以替代字段标签。不应 是数据示例,因为用户容易把占位文本与已填写的字段混淆

mode

对于 One2many:该字段关联记录所使用的显示模式(视图类型),取值为 tree、form、kanban 或 graph 之一。默认为 tree (列表显示)

help

当用户悬停在字段或其标签上时显示的工具提示

filename

对于二进制字段,提供文件名称的相关字段的名称

password

表示某个 Char 字段存储的是密码,其数据不应被显示

kanban_view_ref

用于在移动端环境中从 m2o/m2m 字段选择记录时打开指定的看板视图

label

当 field 组件没有直接放在 group 内,或其 nolabel 属性被设置时,字段的标签不会随其取值自动显示。label 组件是手动显示字段标签的替代方式。可用的属性有:

for (必填)

与该标签所关联字段的引用。可以是字段的名称,也可以是其 id(设置在 field 上的 id 属性)。当视图中同一字段出现多次,并且有多个 label 组件与这些 field 节点关联时,这些标签必须具有唯一的 for 属性(此时引用的是对应 field 节点的 id 属性)。

string

要显示的标签。默认显示字段的标签(来自模型中的字段定义)。

class

与 field 组件相同。

attrs

与 field 组件相同。

通用结构

<form>
  <header>
    <field name="state" widget="statusbar"/>
  </header>
  <sheet>
    <div class="oe_button_box">
      <BUTTONS/>
    </div>
    <group>
      <group>
        <field name="fname"/>
      </group>
    </group>
    <notebook>
      <page string="Page1">
        <group>
          <CONTENT/>
        </group>
      </page>
      <page string="Page2">
        <group>
          <CONTENT/>
        </group>
      </page>
    </notebook>
  </sheet>
</form>

甘特图

Enterprise feature

甘特图视图用于恰当地显示甘特图(用于排程)。

甘特视图的根元素是 <gantt/>,它没有子元素,但可以接受以下属性:

date_start 必填)

为每条记录提供事件开始日期时间的字段名称。

date_stop 必填)

为每条记录提供事件结束时长的字段名称。

dependency_field

提供两条记录之间依赖关系的 many2many 字段名称。如果 B 依赖于 A,dependency_field 就是允许从 B 获取 A 的字段。该字段与 dependency_inverted_field 字段共同用于在条形块之间绘制依赖箭头并对其重新排期。

dependency_inverted_field 提供 dependency_field 时必填)

提供与 dependency_field 相反依赖关系的 many2many 字段名称。如果 B 依赖于 A,dependency_inverted_field 就是允许从 A 获取 B 的字段。

color

用于根据其取值为条形块着色的字段名称

decoration-{$name}

允许根据相应记录的属性更改行文本的样式。

取值为 Python 表达式。对每条记录,表达式会以记录的属性作为上下文值进行求值,如果结果为 true,则将相应样式应用于该行。以下是上下文中可用的其他一些值:

  • uid:当前用户的 id,

  • today:当前本地日期,格式为 YYYY-MM-DD 的字符串,

  • now:与 today 相同,但还包含当前时间。该值的格式为 YYYY-MM-DD hh:mm:ss。

{$name} 可以是以下 bootstrap contextual color 之一(danger、info、secondary、success 或 warning)。

default_group_by

用于对任务分组的字段名称

disable_drag_drop

如果设为 true,甘特视图将不支持任何拖放操作

consolidation

用于在记录单元格中显示汇总值的字段名称

consolidation_max

以”分组”字段为键的字典,值为在单元格显示为红色之前可达到的最大汇总值(例如 {"user_id": 100})

consolidation_exclude

指明任务是否应从汇总中排除的字段名称;如果设为 true,汇总行中会显示一个条纹区域

create, cell_create, edit, delete, plan

通过将相应属性设为 false 默认:true),在视图中 禁用对应操作。

  • create:如果启用,控制面板中将提供 Add 按钮用于创建记录。

  • cell_create:如果启用且 create 已启用,悬停在时间槽单元格上时会显示 “+” 按钮,用于在该时间槽上创建新记录。

  • edit:如果启用,打开的记录将处于编辑模式(因而可编辑)。

  • plan:如果启用且 edit 已启用,时间槽上会显示 “放大镜” 按钮,用于将未指派的记录计划到该时间槽中。

Example

当您不希望在甘特视图中创建记录,且模型上的开始和结束日期均为必填时,应禁用计划功能,因为永远找不到任何记录。

offset

根据刻度不同,为计算默认周期而在今天基础上增加的单位数。例如:default_scale 为周时偏移量为 +1 将打开下周的甘特视图,default_scale 为月时偏移量为 -2 将打开两个月前的甘特视图。

progress

为记录的事件提供完成百分比的字段名称,取值介于 0 到 100 之间

string

甘特视图的标题

precision

JSON 对象,用于指定各刻度下条形块的吸附精度。

刻度 day 的可能取值为(默认:hour):

  • hour:记录时间吸附到整点小时(例如:7:12 变为 8:00)

  • hour:half:记录时间吸附到半点(例如:7:12 变为 7:30)

  • hour:quarter:记录时间吸附到半小时(例如:7:12 变为 7:15)

刻度 week 的可能取值为(默认:day:half):

  • day:记录时间吸附到整天(例如:上午 7:28 变为前一天晚上 11:59:59,晚上 10:32 变为当天中午 12:00)

  • day:half:记录时间吸附到半小时(例如:上午 7:28 变为中午 12:00)

刻度 month 的可能取值为(默认:day:half):

  • day:记录时间吸附到整天(例如:上午 7:28 变为前一天晚上 11:59:59,晚上 10:32 变为当天中午 12:00)

  • day:half:记录时间吸附到半小时(例如:上午 7:28 变为中午 12:00)

刻度 year 始终吸附到整天。

precision 属性示例:{"day": "hour:quarter", "week": "day:half", "month": "day"}

total_row

布尔值,控制是否显示包含记录总数的行。(默认:false)

collapse_first_level

布尔值,控制按一个字段分组时是否可以折叠每一行。(默认:false,按两个字段分组时才会开始折叠)

display_unavailability

布尔值,用于在甘特视图中将模型 gantt_unavailability 函数返回的日期标记为可用。记录仍可安排在这些时段中,但其不可用状态会在视觉上显示出来。(默认:false)

default_scale

渲染视图时的默认刻度。可能取值为(默认:month):

  • day

  • week

  • month

  • year

scales

此视图允许使用的刻度的逗号分隔列表。默认允许所有刻度。可在此列表中使用的刻度取值参见 default_scale。

templates

定义 QWeb 模板 模板 gantt-popover,当用户悬停在甘特视图中的某条记录上时将使用该模板。

甘特视图使用基本标准的 javascript qweb,并提供以下上下文变量:

widget

当前的 GanttRow 实例,可用于获取一些元信息。用于转换为颜色整数的 getColor 方法也可直接在模板上下文中使用,无需借助 widget。

on_create

如果指定了该属性,点击视图上的添加按钮时将启动一个客户端动作,而不是打开通用对话框。其值应为该动作的 xmlid(例如:on_create="%(my_module.my_wizard)d"

form_view_id

用户创建或编辑记录时打开的视图。注意,如果未设置该属性,甘特视图将回退到当前动作中的表单视图 id(如有)。

dynamic_range

如果设为 true,甘特视图将从第一条记录开始,而不是从年/月/日的起点开始。

pill_label

如果设为 true,当刻度为周或月时,时间会显示在条形块标签中。(例如:7:00 AM - 11:00 AM (4h) - DST Task 1)

thumbnails

如果分组字段是关联字段,可在群组名称旁边显示缩略图。其值应为一个 Python 字典,键为当前模型上的字段名称,值为关联模型上保存缩略图的字段名称。

示例:任务有一个引用 res.users 的字段 user_id。res.users 模型有一个保存头像的字段 image,那么:

<gantt
   date_start="date_start"
   date_stop="date_stop"
   thumbnails="{'user_id': 'image_128'}"
 >
 </gantt>

在按 user_id 分组时,将在用户名称旁边显示用户头像。

图表

图表视图用于可视化多条记录或记录组的聚合。其根元素为 <graph>,可以带有以下属性:

type 可选)

bar 默认)、pie 和 line 之一,即要使用的图表类型

stacked 可选)

仅用于 bar 图表。设为 0 可防止组内的条形在初始时堆叠。

disable_linking 可选)

设为 1 可防止点击图表时跳转到列表视图

order 可选)

如果设置,x 轴值默认将按给定顺序(asc 或 desc)根据其度量值排序。仅用于 bar 和 pie 图表。

string 可选)

跳转到列表视图时在面包屑中显示的字符串。

图表视图中唯一允许的元素是 field,它可以具有以下属性:

name (必填)

视图中使用的字段名称。如果用于分组(而非聚合)

invisible 可选)

如果为 true,该字段将不会出现在活动度量中,也不会出现在可选度量中。

type 可选)

如果设置为 measure,该字段将用作组内的聚合值,而不是分组条件。它仅对具有该属性的最后一个字段生效,但对其他带 string 属性的字段也很有用(见下文)。

interval 可选)

在 date 和 datetime 字段上,按指定的时间间隔(day、week、month、quarter 或 year)分组,而不是按具体的 datetime(固定到秒)或 date(固定到天)分组。默认值为 month。

string 可选)

仅用于 type="measure" 的字段。该名称将用于在图形视图中显示字段,会覆盖字段默认的 python String 属性。

度量项自动由模型字段生成;仅使用可聚合的字段。这些度量项还会按字段的 string 属性按字母顺序排序。

Warning

图形视图的聚合基于数据库内容执行,未存储的计算字段(function 字段)不能用于图形视图

网格

Enterprise feature

限制

此视图仍在开发中,可能需要扩展或调整。

  • 目前仅测试了 date 列字段;selection 和 many2one 名义上已实现并支持,但尚未经过测试;datetime 则完全未实现。

  • 列单元格几乎无法配置,且必须为数值类型

  • 单元格调整默认禁用,必须经过配置才能启用

  • 由于 fields_view_get 后处理的限制,视图根节点不会自动设置 create、edit 和 delete ACL 元数据(只有固定明确列表中的视图类型才会获得这些属性)

结构

网格视图在该模块中有自己的结构定义和额外的验证。视图架构如下:

<grid> (1)

架构根元素

  • 必填的 string 属性

  • 可选的 create、edit 和 delete 属性

  • 可选的 adjustment 和 adjust_name 属性

    adjustment 可为 object 或 action,用于指示单元格调整应通过方法调用还是动作执行来完成。adjust_name 分别提供方法名和动作 ID。

    两种情况下,调整参数都会作为 grid_adjust 上下文成员提供;在 object 的情况下,参数还会作为位置函数参数提供(与一个空的 id 列表一起):

    row_domain

    与所调整单元格所在整行匹配的域

    column_field

    所调整单元格对应列的名称

    column_value

    所调整单元格对应列的值

    cell_field

    所调整单元格的度量字段

    change

    单元格旧值与调整后新值之间的差值,可为正数或负数

  • 可选的 hide_line_total 和 hide_column_total 属性

    hide_line_total

    设为 true 以隐藏总计行(默认为 false)

    hide_column_total

    设为 true 以隐藏总计列(默认为 false)

  • 可选的 barchart_total 属性

    barchart_total

    设为 true 以在网格底部显示基于各列总计的柱状图(默认为 false)。

  • 可选的 create_inline 和 display_empty 属性

    create_inline

    设为 true 以在网格底部显示带有 Add a line 按钮的附加行(默认为 false)。设置此选项后,控制面板中的 Add a line 按钮将被隐藏。当没有数据且未设置 display_empty 时(即显示帮助内容时),控制面板中的 Add a line 按钮会显示出来,以便用户创建第一条记录。

    display_empty

    设为 true 以便在没有数据时仍显示网格(默认为 false)。当您希望用户能够跟踪当前期间时,此选项很有用(因为日期显示在列标题中)。提醒一下,当没有数据且未设置此属性时,将显示帮助内容而不是网格。

<button> (0+)

常规的 Odoo 动作按钮,显示在视图标题区

  • 必填的 string 属性(按钮标签)

  • 必填的 type 属性,可为 object 或 action

    Note

    不支持工作流按钮

  • 必填的 name 属性,为要调用的方法名或要执行的动作 ID

  • 可选的 context

服务器回调会收到视图中显示的所有记录 id,或作为传给方法的 ids(object 按钮),或作为上下文中的 active_ids action 按钮)

<field type="row"> (1+)

行分组字段,如果搜索视图有分组过滤器,将被其替换。

视图中 row 字段的顺序决定了分组层级:如果第一个字段是 school,第二个是 age,记录将先按 school 分组,再在每个学校内按 age 分组。

<field type="col"> (1)

列分组字段。

列字段可包含 0 个或多个 <range> 元素,用于指定可自定义的列范围。range 元素具有以下必填属性

name

可通过 grid_range 上下文值覆盖默认范围(默认为第一个)

string

范围按钮的标签(用户可见)

span

视图中一次显示的所有列的跨度的符号名称,可能触发分页。

对于 date 字段,当前有效的跨度为 week 和 month。

step

相邻两列之间步长的符号名称

对于 date 字段,当前唯一有效的跨度是 day。

<field type="measure"> (1)

单元格字段,自动累加(通过 read_group)。

度量字段可使用 widget 属性来自定义其显示。

服务器交互

除可选按钮外,网格视图目前会调用两个方法:

  • read_grid 由该模块在所有模型上提供)以字典形式返回网格内容的几乎全部信息:

    • 行标题是一个字典列表,包含以下键:

      values 必填)

      映射到一个字典,每个 row 字段对应一个键,其值 始终 为 [value, label] 形式。

      domain 必填)

      该行来源的任意记录的域,以便在单元格调整期间需要复制记录时使用

    • 列标题是一个字典列表,至少包含一个键:

      values 必填)

      参见行标题的 values

      domain 必填)

      参见列的 domain 值

      current 可选)

      布尔值,标记/高亮某一列

    • 网格数据是由单元格字典组成的列表(行)的列表(单元格),每个单元格字典包含以下键:

      value

      与单元格关联的数值

      domain

      匹配该单元格记录的域(应视为不透明)

      size

      分组在该单元格中的记录数量

      readonly 可选)

      一个布尔值,表示该特定单元格不应可在客户端编辑

      classes 可选)

      要添加到单元格容器(位于单元格的 TD 与单元格可能可编辑的元素之间)上的类名列表(以字符串形式)。

      如果此列表与基础类(以 o_grid_cell_ 为前缀)冲突,此列表中的类将被忽略。

      请注意,网格数据是 致密 的:如果查询数据库后没有匹配某个单元格的分组,则会生成一个”空”单元格,其必需键使用默认值。

    • prev 和 next:可为假值(无分页),也可为一个上下文项,合并到视图自身的上下文中,用于 read_grid 获取上一页或下一页;应将其视为不透明

  • read_grid_domain(field, range) 由该模块在所有模型上提供)返回匹配网格当前配置的”跨度”的域。read_grid 内部也会执行此操作,但在配合独立的 search_count 或 read_group 等使用时,单独调用可能有用或必要。

  • adjust_grid:目前没有统一的实现,其语义可能会随时间和使用场景而演变

服务器钩子

read_grid 会调用许多钩子,允许在不重写整个方法的情况下从内部定制其操作:

_grid_format_cell(group, cell_field)

将 read_group 的输出(按分组)转换为上述格式(作为”网格数据”的一部分)的单元格

_grid_make_empty_cell(row_domain, column_domain, view_domain)

生成单元格的空版本(当没有对应的分组时)

_grid_column_info(name, range)

基于列类型生成 ColumnMetadata 对象,存储的值要么直接返回(作为 read_grid 的一部分),要么用于查询 read_group 并将其重排为 read_grid:

grouping

列的实际分组字段/查询

domain

在列字段分页时应用于 read_group 的域,可为空列表

prev 和 next

上下文片段,会发送给 read_grid 以获取当前页之前和之后的页面。若为 False,则禁用该方向上的分页

values

要在”当前页”上显示的列值,每个值都是一个字典,包含以下键:

values

将字段名映射到整个列的值的字典,通常只是 name -> 一个值

domain

匹配该特定列的域

is_current

如果当前列应在网格中特别标注则为 True,否则为 False

format

如何将该列/该类型的值从 read_group 格式转换为 read_grid 格式(与 ColumnInfo 中的 values 匹配)

ACL

  • 如果视图不可编辑,则各单元格不可编辑

  • 如果视图不可创建,则不会显示 Add a Line 按钮(它目前会创建一条新的空记录)

上下文键

grid_range

当视图有多个范围时,选择默认使用的范围

grid_anchor

如果适用,将用作列范围的默认锚点,而不是 read_grid 定义的默认值。

对于日期字段,它是用于计算初始跨度的参考日期。默认的日期锚点为”今天”(按用户所在时区)

看板

看板视图是 kanban board 的可视化形式:以 “卡片” 展示记录,介于 列表视图 与不可编辑的 表单视图 之间。记录可以分组到列中,用于工作流的可视化或操作(如任务或工作进度管理),也可以不分组(仅用于展示记录)。

Note

看板视图最多加载并显示十列,其后的列会保持收起状态(但用户仍可手动展开)。

看板视图的根元素为 <kanban>,可以使用以下属性:

default_group_by

指示当动作或当前搜索未指定分组时,看板视图是否应当分组。在没有其他分组指定时,其值应为要分组的字段名称

default_order

当用户尚未(通过列表视图)对记录排序时所使用的卡片排序方式

class

为看板视图的根 HTML 元素添加 HTML 类

examples

如果设置为 KanbanExamplesRegistry 中的某个键,分组看板视图中就会提供列配置的示例。这里 给出了定义这些配置的方法示例。

group_create

指示“添加新列”栏是否可见。默认:true。

group_delete

指示分组是否可以通过上下文菜单删除。默认:true。

group_edit

指示分组是否可以通过上下文菜单编辑。默认:true。

archivable

指示当模型上定义了 active 字段时,某列所属的记录是否可以归档 / 恢复。默认:true。

quick_create

指示是否可以在不切换到表单视图的情况下创建记录。默认情况下,当看板视图按 many2one、selection、char 或 boolean 字段分组时 quick_create 处于启用状态,否则禁用。

quick_create_view

form 视图引用,用于指定快速创建记录时使用的视图。

records_draggable

指示看板分组时是否可以拖动记录。默认:true。

设置为 true 表示始终启用,设置为 false 表示始终禁用。

groups_draggable

指示看板分组时是否可以重新排列各列的顺序。默认:true。

设置为 true 表示始终启用,设置为 false 表示始终禁用。

视图元素可能的子元素有:

field

声明用于看板 逻辑 的字段。如果字段只是在看板视图中显示,则无需预先声明。

可能的属性有:

name 必填)

要获取的字段名称

allow_group_range_value (可选)

指示 date 或 datetime 字段是否允许使用根据分组范围(即该分组的首个与末个日期)计算出的值。当看板视图按该字段分组时,可启用“快速创建”和“拖放”功能。默认:false。

progressbar

声明一个进度条元素,放置在看板列的顶部。

可能的属性有:

field (必填)

其取值用于在进度条中对列内记录再次分组的字段名称

colors (必填)

将上述字段值映射为 “danger”、”warning”、”success” 或 “muted” 颜色的 JSON

sum_field (可选)

该字段的列内记录值将被求和并显示在进度条旁边(省略时显示记录总数)

templates

定义一组 QWeb 模板 模板。为了让定义更清晰,卡片的定义可以拆分为多个模板,但看板视图 必须 至少定义一个根模板 kanban-box,它会为每条记录渲染一次。

看板视图使用大体标准的 javascript qweb,并提供以下上下文变量:

widget

当前的 KanbanRecord(),可用于获取一些元信息。这些方法也可以直接在模板上下文中调用,无需通过 widget 访问

record

一个对象,其属性为所有请求的字段。每个字段都有 value 和 raw_value 两个属性,前者按当前用户的参数格式化,后者是 read() 的直接返回值(date 和 datetime 字段除外,它们 按用户的区域设置格式化)

context

当前上下文,来自动作;若看板视图嵌入在表单视图中,还包括相应的 one2many 或 many2many 字段

user_context

顾名思义

read_only_mode

顾名思义

selection_mode

当在移动端环境中通过 m2o/m2m 字段打开看板视图以选择记录时设为 true。

Note

在移动端环境中点击 m2o/m2m 字段会打开看板视图

按钮与字段

虽然大多数看板模板都是标准的 QWeb 模板,但看板视图会对 field、button 和 a 元素进行特殊处理:

  • 默认情况下字段会被替换为其格式化值,除非指定了 widget 属性,此时其渲染方式和行为取决于对应的组件。可选值包括(但不限于):

    handle

    对于用于记录排序的 sequence (或 integer)字段,允许通过拖放记录来重新排序。

  • 带有 type 属性的按钮和链接会执行 Odoo 相关操作,而非其标准 HTML 功能。可用的类型有:

    action, object

    适用于 Odoo 按钮 的标准行为,可使用大多数与标准 Odoo 按钮相关的属性。

    open

    以只读模式在表单视图中打开该卡片的记录

    edit

    以编辑模式在表单视图中打开该卡片的记录

    delete

    删除该卡片的记录并移除该卡片

如需扩展看板视图,请参阅 KanbanRecord()。

列表

列表视图的根元素为 <tree>2。列表视图的根元素可以具有以下属性:

editable

默认情况下,选中列表视图中的某一行会打开对应的 表单视图。editable 属性使列表视图本身可以就地编辑。

有效值为 top 和 bottom,分别让 新 记录出现在列表的顶部或底部。

内联 表单视图 的结构继承自列表视图。因此,在 表单视图 的字段和按钮上有效的大多数属性也能被列表视图接受,只是当列表视图不可编辑时,它们可能没有任何含义

Note

如果 edit 属性设置为 false,则 editable 选项会被忽略。

multi_edit

可编辑或不可编辑的列表都可以通过定义 multi_edit=1 来启用多人编辑功能。

default_order

覆盖视图的排序方式,取代模型的排序(即模型的 _order 属性)。值为以逗号分隔的字段列表,若要反向排序则在字段后附加 desc:

<tree default_order="sequence,name desc">
    ...
</tree>
decoration-{$name}

允许根据相应记录的属性更改行文本的样式。

{$name} 可以是 bf (font-weight: bold)、it (font-style: italic),或任意 bootstrap contextual color 颜色(danger、info、muted、primary、success 或 warning)。

create, edit, delete, import, export_xlsx

允许通过将对应属性设置为 false 来在视图中 禁用 相应的操作

limit

每页的默认大小。必须为正整数

groups_limit

当列表视图分组时,每页的默认分组数量。必须为正整数

expand

当列表视图分组时,若设为 true 则自动展开第一级分组(默认:false)

列表视图可能的子元素有:

button

在列表单元格中显示一个按钮

icon

用于显示该按钮的图标

string
  • 如果不存在 icon,则为按钮的文本

  • 如果存在 icon,则为该图标提供 alt 文本

type

按钮类型,指示点击该按钮时对 Odoo 的影响:

object

调用列表所属模型上的方法。按钮的 name 即为方法名,调用时会传入当前行的记录 id 和当前上下文。

action

加载并执行一个 ir.actions,按钮的 name 即为该动作的数据库 id。上下文会扩展加入列表所属模型(作为 active_model)、当前行的记录(active_id)以及列表中当前加载的全部记录(active_ids,可能只是与当前搜索匹配的数据库记录的一部分)

name

参见 type

args

参见 type

attrs

根据记录值动态生效的属性。

属性到域的映射;域会在当前行记录的上下文中求值,若为 True,则会在单元格上设置相应属性。

可用属性为 invisible (用于隐藏按钮)。

states

invisible attrs 的简写形式:以逗号分隔的状态列表,要求模型具有 state 字段并且该字段在视图中被使用。

若记录 不 处于所列状态之一,则使按钮 invisible

Danger

将 states 与 attrs 组合使用可能导致意外结果,因为域会以逻辑 AND 方式组合。

context

在执行按钮的 Odoo 调用时合并到视图的上下文中

field

定义一列,用于为每条记录显示对应的字段。可使用以下属性:

name

在当前模型中要显示的字段名称。同一个名称在每个视图中只能使用一次

string

该字段所在列的标题(默认使用模型字段的 string)

invisible

获取并存储该字段,但不在表格中显示该列。对于不应显示、却被例如 @colors 使用的字段而言是必需的

groups

列出应能看到该字段的用户组

widget

字段显示的替代呈现方式。列表视图的可选值包括(但不限于):

progressbar

将 float 字段显示为进度条。

handle

对于用于记录排序的 sequence (或 integer)字段,不显示字段的值,而是显示一个拖放图标以重新排列记录。

sum, avg

在列的底部显示相应的汇总值。汇总仅在 当前显示 的记录上计算。汇总操作必须与对应字段的 group_operator 一致

attrs

根据记录值动态生效的属性。只影响当前字段,例如 invisible 会隐藏该字段,但其他记录的同一字段仍然可见,也不会隐藏整列

width (用于 editable)

当列表中没有数据时,可以通过该属性强制指定列宽。取值可以是绝对宽度(例如 ‘100px’),也可以是相对权重(例如 ‘3’,表示该列比其他列宽 3 倍)。请注意,当列表中有记录时,会让浏览器根据内容自动调整列宽,因此该属性会被忽略。

decoration-{$name}

允许根据相应记录的属性更改单元格文本的样式。

{$name} 可以是 bf (font-weight: bold)、it (font-style: italic),或任意 bootstrap contextual color 颜色(danger、info、muted、primary、success 或 warning)。

nolabel

如果设置为 “1”,列标题将保持为空。此外,该列也无法排序。

optional

使该列变为可选。设为 “hide” 时该列默认隐藏;设为 “show” 时该列默认显示。用户的可见性选择会存储在浏览器本地存储中。

Note

如果列表视图是 editable 的,则 表单视图 中的任意字段属性都有效,并在设置内联表单视图时使用。

Note

对于列表子视图(在表单视图中显示 One2many/Many2many),column_invisible 属性可以根据父对象隐藏某一列。

<field name="product_is_late" attrs="{'column_invisible': [('parent.has_late_products', '=', False)]}"/>

Note

当列表视图被分组时,数值字段会按组汇总并显示。此外,如果某个分组中的记录过多,分组行的右侧会出现一个分页器。因此,当列表视图处于可能被分组的情形时,最好不要把数值字段放在最后一列(不过表单视图中的 x2many 字段没有问题,因为它们无法分组)。

groupby

当按 many2one 字段对记录分组时,为当前视图定义带按钮的自定义分组头。也可以在 groupby 内部添加 field,供修饰符使用。这些字段因此属于 many2one 的 comodel,并会被批量获取。

name

many2one 字段的名称(在当前模型上)。当按该字段对视图分组时,会显示自定义分组头。

<groupby name="partner_id">
  <field name="name"/> <!-- name of partner_id -->
  <button type="edit" name="edit" string="Edit"/>
  <button type="object" name="my_method" string="Button1"
    attrs="{'invisible': [('name', '=', 'Georges')]}"/>
</groupby>

可以定义特殊按钮(type="edit")来打开 many2one 表单视图。

control

为当前视图定义自定义控件。

只有当父级 tree 视图位于 One2many 字段内时,这样做才有意义。

不支持任何属性,但可以有子元素:

create

在当前列表上添加一个用于创建新元素的按钮。

Note

若定义了任意 create,将覆盖默认的 “add a line” 按钮。

支持以下属性:

string (必填)

按钮上显示的文本。

context

在获取新记录的默认值时,该上下文会与现有上下文合并。

例如,可用于覆盖默认值。

以下示例将覆盖默认的 “add a line” 按钮,用 3 个新按钮替换它:”Add a product”、”Add a section” 和 “Add a note”。

“Add a product” 会将字段 ‘display_type’ 设置为其默认值。

另外两个按钮会将字段 ‘display_type’ 分别设置为 ‘line_section’ 和 ‘line_note’。

<control>
  <create
    string="Add a product"
  />
  <create
    string="Add a section"
    context="{'default_display_type': 'line_section'}"
  />
  <create
    string="Add a note"
    context="{'default_display_type': 'line_note'}"
  />
</control>
2

由于历史原因,它源自 tree 类型的视图,后来被改造为更接近表格/列表的显示方式

映射

Enterprise feature

此视图能够在地图上显示记录以及记录之间的路线。记录以图钉表示。它还支持在与记录图钉关联的弹出窗口中显示模型的字段。

Note

应用此视图的模型应包含一个 res.partner 多对一字段,因为视图依赖 res.partner 的地址和坐标字段来定位记录。

API

该视图使用地理位置数据平台的 API 获取地图瓦片(地图背景)、进行地址转发(将地址转换为一组坐标)并获取路线。该视图实现了两个 API:OpenStreetMap 和 MapBox。默认使用 OpenStreetMap,它可以获取 tiles 并执行 geoforwarding。此 API 不需要令牌。一旦在常规设置中提供了有效的 MapBox 令牌,视图就会切换到 MapBox API。此 API 更快,并且支持路线计算。可通过在 MapBox 上 signing up 获取令牌。

结构组件

该视图的根元素是 <map>。它可以具有以下属性:

res_partner

包含 res.partner 多对一字段。如果未提供,视图将创建一个空地图。

default_order

如果提供了字段,视图将覆盖模型的默认排序。该字段必须是应用此视图的模型的一部分,而不是 res.partner 的字段。

routing

如果为 1,则显示记录之间的路线。视图需要有效的 MapBox 令牌以及至少两条已定位的记录(即记录具有 res.partner 多对一字段,且该业务伙伴拥有地址或有效坐标)。

hide_name

如果为 1,则在图钉弹出窗口中隐藏名称(默认:0)。

hide_address

如果为 1,则在图钉弹出窗口中隐藏地址(默认:0)。

hide_title

如果为 1,则在图钉列表中隐藏标题(默认:0)。

panel_title

用作图钉列表标题的字符串。如果未提供,标题为动作的名称;如果视图不在动作中,则为 “Items”。

limit

要获取的最大记录数(默认:80),必须为正整数。

<map> 元素可以包含多个 <field> 元素。每个 <field> 元素会被解释为图钉弹出窗口中的一行。字段的属性如下:

name

要显示的字段。

string

显示在字段内容之前的字符串。可用作描述。

以下是一个地图示例:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1">
    <field name="partner_id" string="Customer Name"/>
</map>

透视表

透视表视图用于以 pivot table`_(透视表)的形式展示聚合数据。其根元素为 ``<pivot>`,可以接受以下属性:

disable_linking 可选)

设置为 1 以移除表格单元格指向列表视图的链接。

display_quantity 可选)

设置为 1 以默认显示数量列。

default_order 可选)

用作视图默认排序的度量名称及排序方式(asc 或 desc)。

<pivot default_order="foo asc">
   <field name="foo" type="measure"/>
</pivot>

透视表视图中唯一允许的元素是 field,它可以具有以下属性:

name (必填)

视图中使用的字段名称。如果用于分组(而非聚合)

string 可选)

将用于在透视表视图中显示该字段的名称,会覆盖字段默认的 python String 属性。

type 可选)

指示该字段应用作分组条件,还是用作组内的聚合值。可能的取值为:

row 默认)

按指定字段分组,每个组占据单独一行。

col

按列创建分组

measure

组内进行聚合的字段

interval

在 date 和 datetime 字段上,按指定的时间间隔(day、week、month、quarter 或 year)分组,而不是按具体的 datetime(固定到秒)或 date(固定到天)分组。

invisible 可选)

如果为 true,该字段既不会出现在激活的度量项中,也不会出现在可选择的度量项中(适用于聚合后没有意义的字段,例如单位不同的字段,如 € 和 $)。

度量项自动由模型字段生成;仅使用可聚合的字段。这些度量项还会按字段的 string 属性按字母顺序排序。

Warning

与图形视图一样,透视表基于数据库内容聚合数据,这意味着未存储的计算字段(function 字段)不能用于透视表视图

在透视表视图中,field 可以具有 widget 属性来指定其格式。该 widget 应是字段格式化器,其中最有用的是 date、datetime、float_time 和 monetary。

例如,一个工时透视表视图可以定义为:

<pivot string="Timesheet">
    <field name="employee_id" type="row"/>
    <field name="date" interval="month" type="col"/>
    <field name="unit_amount" type="measure" widget="float_time"/>
</pivot>

QWeb

QWeb 视图是位于视图 arch 中的标准 QWeb 模板 模板。它们没有特定的根元素。由于 QWeb 视图没有特定的根元素,必须显式指定其类型(无法从 arch 字段的根元素推断)。

QWeb 视图有两种使用场景:

  • 它们可以用作前端模板,此时应使用 template 作为快捷方式。

  • 它们可以用作真正的 qweb 视图(在动作中打开),此时应将其定义为带有显式 type 无法推断)和模型的常规视图。

qweb-as-view 相对于基本 qweb-as-template 的主要新增内容如下:

  • qweb-as-view 对带有 CSS 类 o_qweb_cp_buttons 的 <nav> 元素做了特殊处理:其内容应为按钮,将被提取并移动到控制面板的按钮区域,<nav> 本身会被移除;这是针对控制面板视图尚未存在的一种变通方案

  • qweb-as-view 渲染会在标准 qweb 渲染上下文中添加若干条目:

    model

    qweb 视图绑定的模型

    domain

    搜索视图提供的域

    context

    搜索视图提供的上下文

    records

    指向 model.search(domain) 的惰性代理,如果您只想遍历记录而不执行更复杂的操作(例如分组),可以使用它

  • qweb-as-view 还提供了额外的渲染钩子:

    • _qweb_prepare_context(view_id, domain) 准备 qweb-as-view 专用的渲染上下文

    • qweb_render_view(view_id, domain) 是由客户端调用的方法,它会调用上下文准备方法,并最终调用 env['ir.qweb'].render()。

搜索默认值

可以通过动作的 context,使用 search_default_name 键来配置搜索字段与过滤器。字段的值应为要设置在字段中的值;过滤器的值为布尔值或数字。例如,假设 foo 是字段、bar 是过滤器,则动作上下文为:

{
  'search_default_foo': 'acro',
  'search_default_bar': 1
}

将自动启用 bar 筛选器,并在 foo 字段中搜索 acro。

可以使用数值(1 到 99 之间)来描述默认分组(groupby)的顺序。例如,如果 foo 和 bar 表示两个分组

{
  'search_default_foo': 2,
  'search_default_bar': 1
}

效果是先激活 bar,再激活 foo。