视图

视图是定义记录如何显示给最终用户的方式。它们以XML格式指定,这意味着可以独立于它们所代表的模型进行编辑。它们灵活且允许对其控制的屏幕进行高度自定义。存在各种类型的视图。每个视图代表一种可视化模式: 表单列表看板 等。

通用结构

通常,基本视图共享下面定义的通用结构。占位符用大写字母表示。

<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>

字段

View对象公开了许多字段。除非另有说明,否则它们都是可选的。

  • name (mandatory) Char

    只有在某种列表中查找视图时,作为视图的助记符/描述才有用。

  • model Char

    视图所链接的模型(如适用)。

  • priority Integer

    当通过 (model, type) 请求视图时,将返回与模型和类型匹配且优先级最低的视图(即默认视图)。

    它还定义了在 视图继承 过程中应用视图的顺序。

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

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

    如果视图扩展了现有视图,则只有当用户具有访问所提供的 groups_id 的权限时,扩展才会应用于给定用户。

  • arch Text

    视图布局的描述。

属性

不同的视图类型具有各种属性,允许对通用行为进行自定义。这里将解释一些主要属性。它们并不对所有视图类型都产生影响。

注解

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

  • create

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

  • editform & list & gantt

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

  • delete (form & list)

    通过 操作 下拉菜单禁用/启用视图上的记录删除。

  • duplicate (form)

    通过 操作 下拉菜单在视图上禁用/启用记录复制。

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

    根据相应记录的属性,定义类似于行文本的记录的条件显示。

    值是Python表达式。对于每个记录,表达式将使用记录的属性作为上下文值进行评估,如果为 true ,则将应用相应的样式到行中。以下是上下文中其他可用的值:

    • uid: the id of the current user,

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

    警告

    两种视图类型支持的值不同。甘特视图仅支持 success, info, warning, dangersecondary 显示。列表视图支持 bf, it, success, info, warning, danger, mutedprimary 显示。

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

    如果当前模型没有找到记录,则使用一组示例记录填充视图。默认情况下,此属性为false。

    这些虚假记录将具有某些字段名称/模型的启发式。例如,模型’res.users’上的字段’display_name’将填充示例人名,而’email’字段将采用’firstname.lastname@sample.demo’的形式。

    用户将无法与这些数据进行交互,并且它们将在执行操作(创建记录、添加列等)后立即被丢弃。

  • banner_route a route address to be fetched and prepended to the view.

    如果设置了此属性,则会获取并显示 controller 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 模式的 最近 父级。

视图解析

Resolution generates the final arch for a requested/matched primary view:

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

  2. 如果视图没有父级,则其 arch 保持不变

  3. 查找当前视图的子视图,使用 extension 模式,并深度优先应用它们的继承规范(先应用子视图,然后是它的子视图,最后是它的兄弟视图)

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

继承规范

继承规范由元素定位器组成,用于匹配父视图中继承的元素,以及将用于修改继承元素的子元素。

有三种元素定位器可用于匹配目标元素:

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

  • 具有 name 属性的 field 元素,与具有相同 name 的第一个 field 匹配。在匹配过程中,忽略所有其他属性

  • 任何其他元素:匹配具有相同名称和相同属性(忽略 positionversion 属性)的第一个元素

<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>

Inheritance规范可以有一个可选的 position 属性,指定匹配节点应如何更改:

inside (default)

继承规范的内容将附加到匹配的节点上

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

可以作为继承规范的直接子节点,使用 insidereplaceafterbeforeposition 属性来移动一个节点。

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

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

视图的规格按顺序应用。

1

在 QWeb 视图中添加了一个扩展函数,用于更简单的匹配: hasclass(*classes) 匹配上下文节点是否具有所有指定的类

通用模型

属性

Model._date_name = 'date'

用于默认日历视图的字段

方法

Model.get_views(views, options=None)[源代码]

返回给定视图的字段视图,以及当前模型的字段,以及可选地为给定操作返回其过滤器。

参数
  • views – 视图列表 [视图ID,视图类型]

  • options (dict) – 一个可选的布尔标志字典,设置为启用: toolbar 包括加载 fields_views 时的上下文操作 load_filters 返回模型的过滤器 action_id 获取过滤器的操作ID,否则加载全局过滤器或模型

返回

包含 fields_views、fields 和可选 filters 的字典

Model.get_view([view_id | view_type='form'])[源代码]

获取请求视图的详细组成,例如模型、视图架构

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

  • view_type (str) – 如果视图ID为None,则返回的视图类型(’form’,’tree’,…)

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

返回

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

返回类型

dict

引发
  • AttributeError

    • 如果继承的视图除了 ‘before’、’after’、’inside’、’replace’ 之外还有未知的位置,则无法处理。

    • 如果在父视图中发现除’position’之外的标签

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

视图类型

活动

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

警告

只有在安装了 mail 模块并且继承自 mail.activity.mixin 的模型中,才能使用活动视图。

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

string (mandatory)

一个描述视图的标题

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

field

声明在活动 逻辑 中使用的字段。如果字段仅在活动视图中显示,不需要预先声明。

可能的属性有:

name (required)

要获取的字段的名称

templates

定义了 QWeb模板 模板。卡片定义可以分成多个模板以增加清晰度,但是活动视图 必须 定义至少一个根模板 activity-box,该模板将为每个记录渲染一次。

活动视图主要使用标准的 javascript qweb 并提供以下上下文变量 (详见 看板 获取更多详情):

widget

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

record

一个对象,其属性是所有请求的字段。每个字段都有两个属性 valueraw_value

日历

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

注解

默认情况下,日历视图将以当前日期(今天)为中心。您可以将特定的初始日期传递给操作的上下文,以便将日历的初始焦点设置在围绕此日期的期间(参见 mode)(使用的上下文键为 initial_date

它们的根元素是 <calendar>。日历视图上可用的属性有:

date_start (required)

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

date_stop

如果提供了 date_stop ,则记录的字段名称将包含事件的结束日期,记录将可以通过拖放直接在日历中移动

date_delay

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

color

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

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

提供的比例尺的逗号分隔列表。默认情况下,所有比例尺都可用。有关可能的比例尺值,请参见模式。

create, delete

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

<field>

声明要聚合或在看板 逻辑 中使用的字段。如果字段仅在日历卡片中显示。

字段可以有额外的属性:

invisible

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

avatar_field

仅适用于x2many字段,在卡片中显示头像而不是显示名称

write_modelwrite_fieldfilter_field

您可以添加筛选器并将结果保存在定义的模型中,筛选器将添加在侧边栏中。 filter_field 是可选的,允许您指定将保存筛选器状态的字段。

filterscolor

使用”True”将此字段添加到侧边栏的筛选器中。您可以指定一个 color 字段用于给复选框上色。

同期

Enterprise feature

群体视图用于显示和理解一些数据随时间变化的方式。例如,假设对于某个企业,客户可以订阅某些服务。然后,群体视图可以显示每个月的订阅总数,并研究客户离开服务的速率(流失率)。单击单元格时,群体视图将重定向您到一个新的操作,您将只看到单元格时间间隔内包含的记录;此操作包含列表视图和表单视图。

注解

默认情况下,同一列表和表单视图将在动作上定义。您可以将列表视图和表单视图传递给动作的上下文,以设置/覆盖将使用的视图(使用的上下文键为 form_view_idlist_view_id

例如,这里是一个非常简单的同期视图:

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

Cohort视图的根元素是<cohort>,它接受以下属性:

string (mandatory)

一个描述视图的标题

date_start (mandatory)

一个有效的日期或日期时间字段。该字段被视图理解为记录的开始日期。

date_stop (mandatory)

一个有效的日期或日期时间字段。该字段被视图理解为记录的结束日期。这是确定流失的字段。

mode (optional)

一个描述模式的字符串。它应该是’churn’或’retention’(默认)。Churn模式将从0%开始随着时间的推移而累积,而retention模式将从100%开始随着时间的推移而减少。

timeline (optional)

一个描述时间轴的字符串。它应该是’backward’或’forward’(默认)。前向时间轴将显示从date_start到date_stop的数据,而后向时间轴将显示从date_stop到date_start的数据(当date_start在未来/大于date_stop时)。

interval (optional)

描述时间间隔的字符串。它应该是 ‘day’,’week’,’month’(默认)或 ‘year’。

measure (optional)

可聚合的字段。该字段将用于计算每个单元格的值。如果未设置,则队列视图将计算出现次数。

<field> (optional)

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

name (mandatory)

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

string (optional)

将在队列视图中显示该字段的名称,覆盖字段的默认 Python 字符串属性。

invisible (optional)

如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中(对于不适合聚合的字段非常有用,例如不同单位的字段,例如 € 和 $)。

表单

表单视图用于显示单个记录的数据。它们的根元素是 <form>。它们由常规的 HTML 组成,还有额外的结构和语义组件。

结构组件

结构组件提供结构或“视觉”特征,具有较少的逻辑。它们用作表单视图中的元素或元素集。

notebook

定义一个带有选项卡的部分。每个选项卡通过一个 page 子元素来定义。页面可以具有以下属性:

string (required)

选项卡的标题

accesskey

一个HTML访问键

attrs

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

注解

请注意, notebook 不应放置在 group

group

用于在表单中定义列布局。默认情况下,组定义2列,大多数组的直接子元素占用1列。组的 field 直接子元素默认显示标签,标签和字段本身各自具有1个colspan。

The number of columns in a group can be customized using the col attribute, the number of columns taken by an element can be customized using colspan.

子元素水平排列(尝试填充下一列,然后再换行)。

Groups can have a string attribute, which is displayed as the group’s title

newline

只在 group 元素内有用,提前结束当前行并立即切换到新行(在此之前不填充任何剩余列)

separator

小的水平间距,带有 string 属性的行为类似于一个标题

sheet

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

header

sheet 结合使用,提供了一个全宽度的位置,位于表单本身上方,通常用于显示工作流按钮和状态小部件

语义组件

语义组件与Odoo系统相连,并允许与之交互。可用的语义组件包括:

button

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

special

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

confirm

在执行按钮的Odoo调用之前,要显示的确认消息(并由用户接受)(在看板视图中也适用)。

field

渲染(并允许编辑)当前记录的单个字段。在表单视图中多次使用字段是支持的,并且字段可以接收不同的修饰符’invisible’和’readonly’的值。但是,当存在多个字段具有不同的修饰符’required’的值时,行为不能保证。字段节点的可能属性包括:

name (mandatory)

要呈现的字段的名称

id

节点 ID。当视图中存在多个相同字段的情况时有用(参见下面的 标签 组件)。默认为字段名称。

widget

字段根据其类型(例如 CharMany2one )具有默认渲染。 widget 属性允许使用不同的渲染方法和上下文。

options

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

class

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

oe_inline

防止字段后的通常换行,并限制它们的跨度。

oe_left, oe_right

将字段浮动到相应的方向

oe_read_only, oe_edit_only

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

oe_avatar

对于图像字段,将图像显示为“头像”(正方形,最大尺寸为90x90,带有一些图像装饰)

groups

仅为特定用户显示该字段

on_change

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

8.0 版后已移除: 在模型上使用 odoo.api.onchange()

attrs

基于记录值的动态元参数

domain

仅适用于关系字段,在选择现有记录时应用的过滤器

context

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

readonly

在只读和编辑模式下显示字段,但永远不要使其可编辑

required

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

nolabel

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

placeholder

空白 字段中显示的帮助信息。可以替换复杂表单中的字段标签。 不应该 是数据示例,因为用户可能会将占位文本与填充字段混淆。

mode

对于 One2many ,用于字段关联记录的显示模式(视图类型)。可选值为 treeformkanbangraph 。默认值为 tree (列表显示)

help

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

filename

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

password

表示一个 Char 字段存储密码,其数据不应该被显示

kanban_view_ref

在移动环境中从m2o/m2m中选择记录时打开特定看板视图

label

field 组件不直接放置在 group 内部,或者当其 nolabel 属性被设置时,字段的标签不会自动显示在其值旁边。 label 组件是手动显示字段标签的替代方法。可能的属性有:

for (mandatory)

与标签相关联的字段的引用。可以是字段的名称,也可以是其id(在“field”上设置的“id”属性)。当视图中存在多个相同字段的情况,并且有多个与这些“field”节点关联的“label”组件时,这些标签必须具有唯一的“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 视图的根元素是 <gantt/>,它没有子元素,但可以使用以下属性:

date_start (required)

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

date_stop (required)

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

dependency_field

提供两个记录之间依赖关系的 many2many 字段的名称。如果B依赖于A,则 dependency_field 是允许从B获取A的字段。这个字段和 dependency_inverted_field 字段都用于绘制依赖箭头,以便调整它们的时间表。

``dependency_inverted_field``(如果提供了``dependency_field``则必填)

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

color

用于根据其值着色药丸的字段名称

decoration-{$name}

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

值是Python表达式。对于每个记录,表达式将使用记录的属性作为上下文值进行评估,如果为 true ,则将应用相应的样式到行中。以下是上下文中其他可用的值:

  • uid: the id of the current user,

  • today:当前本地日期,格式为``YYYY-MM-DD``,

  • now:与``today``相同,只是加上了当前时间。此值的格式为``YYYY-MM-DD hh:mm:ss``。

{$name} 可以是以下 bootstrap contextual color (danger, info, secondary, successwarning)。

default_group_by

按字段分组任务的字段名称

disable_drag_drop

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

consolidation

在记录单元格中显示合并值的字段名称

consolidation_max

将“group by”字段作为键,最大合并值达到显示红色单元格之前的字典(例如 {"user_id": 100}

consolidation_exclude

描述任务是否需要从合并中排除的字段名称,如果设置为true,则在合并行中显示带条纹的区域

create, cell_create, edit, delete, plan

允许通过将相应的属性设置为 false (默认值: true )来 禁用 视图中的相应操作。

  • create:如果启用,控制面板中将会有一个“添加”按钮,用于创建记录。

  • cell_create:如果启用并且启用了``create``,则在悬停在时间槽单元格上时将显示一个”+”按钮,以在该槽上创建新记录。

  • edit: If enabled, the opened records will be in edit mode (thus editable).

  • plan:如果启用并且启用了``edit``,将在时间槽上显示一个“放大镜”按钮,以将未分配的记录计划到该时间槽。

Example

当您不想在甘特视图上创建记录,并且模型需要开始和结束日期时,应禁用计划功能,因为永远找不到记录。

offset

根据规模,添加到今天以计算默认周期的单位数。例如:在默认规模为周的情况下,偏移量为+1将打开下周的甘特图视图,在默认规模为月的情况下,偏移量为-2将打开2个月前的甘特图视图。

progress

记录事件完成百分比的字段名称,介于0和100之间

string

甘特图视图的标题

precision

JSON 对象,指定每个刻度中药丸的捕捉精度。

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

  • hour: records times snap to full hours (ex: 7:12 becomes 8:00)

  • hour:half: records times snap to half hours (ex: 7:12 becomes 7:30)

  • hour:quarter: records times snap to half hours (ex: 7:12 becomes 7:15)

Possible values for scale week are (default: day:half):

  • day: records times snap to full days (ex: 7:28 AM becomes 11:59:59 PM of the previous day, 10:32 PM becomes 12:00 PM of the current day)

  • day:half: records times snap to half hours (ex: 7:28 AM becomes 12:00 PM)

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

  • day: records times snap to full days (ex: 7:28 AM becomes 11:59:59 PM of the previous day, 10:32 PM becomes 12:00 PM of the current day)

  • day:half: records times snap to half hours (ex: 7:28 AM becomes 12:00 PM)

Scale year always snap to full day.

精度属性的示例: {"day": "hour:quarter", "week": "day:half", "month": "day"}

total_row

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

collapse_first_level

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

display_unavailability

boolean 用于标记模型的 gantt_unavailability 函数返回的日期在甘特图视图中是否可用。记录仍然可以在其中安排,但它们的不可用性会在视觉上显示出来。(默认值: false

default_scale

渲染视图时的默认比例。可能的值为(默认值: month ):

  • day

  • week

  • month

  • year

scales

逗号分隔的允许此视图的比例列表。默认情况下,允许所有比例。要在此列表中使用的可能比例值,请参见 default_scale

templates

定义了 QWeb模板 模板 gantt-popover,当用户悬停在甘特图视图中的记录之一时使用。

gantt视图主要使用标准的 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字典,其键是活动模型上字段的名称。值是相关模型上持有缩略图的字段的名称。

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

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

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

图表

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

type (optional)

one of bar (default), pie and line, the type of graph to use

stacked (optional)

仅用于 bar 图表。设置为 0 以防止组内的柱形图最初被堆叠。

disable_linking (optional)

将其设置为 1 以防止将图表上的点击重定向到列表视图

order (optional)

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

string (optional)

重定向到列表视图时在面包屑中显示的字符串。

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

name (mandatory)

视图中要使用的字段名称。如果用于分组(而不是聚合),请使用此字段。

invisible (optional)

如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中。

type (optional)

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

interval (optional)

在日期和日期时间字段上,按指定的间隔(dayweekmonthquarteryear)进行分组,而不是按照具体的日期时间(固定的秒分辨率)或日期(固定的天分辨率)进行分组。默认为 month

string (optional)

仅用于具有 type="measure" 的字段。在图表视图中显示字段的名称,覆盖字段的默认 Python 字符串属性。

度量值是从模型字段自动生成的;只使用可聚合字段。这些度量值也按字段字符串的字母顺序排序。

警告

图形视图聚合是在数据库内容上执行的,非存储函数字段不能在图形视图中使用。

网格

Enterprise feature

限制

此视图正在进行中,可能需要扩展或更改。

  • 只有 date 列字段已经测试过, selectionmany2one 名义上已经实现和支持,但尚未测试, datetime 根本没有实现。

  • 列单元格几乎不可配置且必须为数字

  • 单元格调整默认情况下被禁用,必须配置为启用

  • create, editdelete ACL 元数据不会自动设置在视图根上,因为在 fields_view_get 后处理中存在限制(有一个固定的显式列表来获取这些属性的视图类型)

模式

网格视图在此模块中具有自己的架构和额外的验证。视图架构如下:

<grid> (1)

架构根元素

  • 必填的 string 属性

  • 可选的 createeditdelete 属性

  • 可选的 adjustmentadjust_name 属性

    adjustment 可以是 objectaction,用于指示是否通过方法调用或操作执行来执行单元格的调整。adjust_name 分别提供了方法名称和操作 id。

    在这两种情况下,调整参数都作为 grid_adjust 上下文成员提供,在 object 情况下,参数也作为位置函数参数提供(紧挨着一个空的 id 列表):

    row_domain

    匹配已调整单元格整行的域

    column_field

    调整单元格的列名称

    column_value

    已调整单元格的列的值

    cell_field

    已调整单元格的度量字段

    change

    单元格旧值和调整后值之间的差异可能为正或负

  • 可选的 hide_line_totalhide_column_total 属性

    hide_line_total

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

    hide_column_total

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

  • 可选的 barchart_total 属性

    barchart_total

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

  • 可选的 create_inlinedisplay_empty 属性

    create_inline

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

    display_empty

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

<button> (0+)

在视图标题中显示的常规Odoo操作按钮

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

  • 必填的 type 属性,可以是 objectaction

    注解

    不支持工作流按钮

  • 必填的 name 属性,可以是要调用的方法的名称,也可以是要执行的操作的 ID

  • 可选的 context

服务器回调函数提供了在视图中显示的所有记录的ID,可以作为传递给方法的ID(``object``按钮)或上下文的``active_ids``(``action``按钮)

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

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

在视图中, row 字段的顺序决定了它们的分组深度:如果第一个字段是 school ,第二个字段是 age ,那么记录将首先按 school 分组,然后在每个学校内按 age 分组。

<field type="col"> (1)

列分组字段。

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

name

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

string

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

span

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

对于 date 字段,有效的时间跨度目前有 weekmonth

step

前一列和后一列之间的步骤的符号名称

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

<field type="measure"> (1)

Cell field, automatically accumulated (by read_group).

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

服务器交互

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

  • read_grid (provided on all models by the module) returns almost the entirety of the grid’s content as a dict:

    • 行标题是一个带有以下键的字典列表:

      values (required)

      这将映射到一个字典,每个``row``字段都有一个键,值始终是``[value, label]``的形式。

      domain (required)

      在单元格调整期间需要复制记录时,此行源记录的域

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

      values (required)

      查看行标题值

      domain (required)

      查看列域值

      current (optional)

      布尔值,标记/突出显示一列

    • 将网格数据作为单元格字典的列表(行的列表)的列表返回,每个单元格字典都具有以下键:

      value

      与单元格相关联的数值

      domain

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

      size

      单元格中分组的记录数

      readonly (optional)

      一个布尔值,指示此特定单元格不应该在客户端进行编辑

      classes (optional)

      一个字符串列表,包含要添加到单元格容器中(在单元格的 TD 和可编辑元素之间)的类。

      在这个列表和基类(以 o_grid_cell_ 为前缀)之间发生冲突时,将忽略此列表中的类。

      请注意,网格数据是 密集的 ,如果查询数据库时没有匹配到任何组与单元格匹配,则会生成一个带有默认值的”空”单元格,以满足必需键。

    • prevnext 可以是 falsy(无分页)或者是一个上下文项,用于合并到视图自身的上下文中,以便于 read_grid 读取上一页或下一页,应该假设它是不透明的

  • ``read_grid_domain(field, range)``(由模块提供在所有模型上)返回与网格的当前配置的“span”匹配的域。这也是由``read_grid``在内部完成的,但是可以独立调用并与单独的例如``search_count``或``read_group``一起使用。

  • adjust_grid, for which there currently isn’t a blanket implementation and whose semantics are likely to evolve with time and use cases

服务器钩子

read_grid calls a number of hooks allowing the customisation of its operations from within without having to override the entire method:

_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 中应用的域,可以是空列表

prevnext

在当前页面之前和之后,将被发送到 read_grid 的上下文段。如果为 False,则禁用该方向的分页

values

在“当前页面”上显示的列值,每个值都是一个带有以下键的字典:

values

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

domain

匹配此特定列的域

is_current

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

format

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

访问控制列表

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

  • 如果视图不可创建,则不会显示“添加一行”按钮(当前它会创建一个新的空记录)

上下文键

grid_range

选择默认使用哪个范围,如果视图有多个范围

grid_anchor

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

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

看板

kanban 视图是一个 kanban board 可视化:它将记录显示为”卡片”,介于 列表视图 和 不可编辑的 表单视图 之间。记录可以分组在列中,用于工作流可视化或操作(例如任务或工作进展管理),或者不分组(仅用于可视化记录)。

注解

看板视图最多会加载和显示十列。超过十列的列会被关闭(但用户仍然可以打开它们)。

Kanban 视图的根元素是 <kanban>,它可以使用以下属性:

default_group_by

如果没有通过操作或当前搜索指定分组方式,是否应该对看板视图进行分组。当没有其他指定分组方式时,应该按字段名称进行分组。

default_order

如果用户尚未通过列表视图对记录进行排序,则使用的卡片排序顺序

class

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

examples

如果设置为 KanbanExamplesRegistry _ 中的一个键,列设置的示例将在分组看板视图中可用。 这里 <https://github.com/odoo/odoo/blob/99821fdcf89aa66ac9561a972c6823135ebf65c0/addons/project/static/src/js/project_task_kanban_examples.js#L27> _ 是如何定义这些设置的一个示例。

group_create

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

group_delete

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

group_edit

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

archivable

如果模型定义了一个 active 字段,则该字段所属的记录是否可以被归档/恢复。默认值:true。

quick_create

是否应该允许在不切换到表单视图的情况下创建记录。默认情况下,当看板视图按many2one、selection、char或boolean字段分组时, quick_create 是启用的,否则是禁用的。

quick_create_view

form view reference, specifying the view used for records quick creation.

records_draggable

是否允许在看板分组时拖动记录。默认值:true。

将其设置为 true 以始终启用它,将其设置为 false 以始终禁用它。

groups_draggable

是否允许在看板分组时重新排序列。默认值:true。

将其设置为 true 以始终启用它,将其设置为 false 以始终禁用它。

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

field

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

可能的属性有:

name (required)

要获取的字段的名称

allow_group_range_value (optional)

一个 datedatetime 字段是否允许从分组范围(由分组的第一个和最后一个日期组成)计算出一个值。当看板视图按该字段分组时,启用“快速创建”和“拖放”功能。默认值:false。

progressbar

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

可能的属性有:

field (required)

用于在进度条中对列记录进行分组的字段名称

colors (required)

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

sum_field (optional)

将被求和并显示在进度条旁边的字段的名称(如果省略,则显示记录的总数)

templates

定义了一组 QWeb模板 模板。卡片定义可以分成多个模板以增加清晰度,但是看板视图 必须 定义至少一个根模板 kanban-box,该模板将为每条记录渲染一次。

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

widget

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

record

一个对象,其属性是所有请求字段。每个字段有两个属性 valueraw_value,前者根据当前用户参数进行格式化,后者是从 read() 直接获取的值(除了日期和日期时间字段,它们根据用户的区域设置进行格式化 <https://github.com/odoo/odoo/blob/a678bd4e/addons/web_kanban/static/src/js/kanban_record.js#L102>`_)

context

当前上下文来自操作,并且在嵌入表单视图的看板视图中,还包括 one2many 或 many2many 字段

user_context

不言自明

read_only_mode

不言自明

selection_mode

当从 m2o/m2m 字段选择记录时,在移动环境中打开看板视图时设置为 true。

注解

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

按钮和字段

虽然大多数看板模板都是标准的 QWeb模板 ,但看板视图会特别处理 fieldbuttona 元素:

  • 默认情况下,字段将被其格式化值替换,除非指定了 widget 属性,在这种情况下,它们的呈现和行为取决于相应的小部件。可能的值包括(但不限于):

    handle

    对于 sequence``(或 ``integer)字段,用于对记录进行排序,允许拖放记录以重新排序。

  • 带有 type 属性的按钮和链接将执行Odoo相关操作,而不是它们的标准HTML功能。可能的类型包括:

    action, object

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

    open

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

    edit

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

    delete

    删除卡片记录并移除卡片

如果您需要扩展看板视图,请参阅 KanbanRecord()

列表

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

editable

默认情况下,选择列表视图的行会打开相应的 表单视图editable 属性使得列表视图本身可以原地编辑。

有效值为 topbottom,分别将 记录显示在列表的顶部或底部。

内联 表单视图 的架构源自列表视图。大多数适用于 表单视图 的字段和按钮的属性也适用于列表视图,尽管如果列表视图不可编辑,这些属性可能没有任何意义。

注解

如果 edit 属性设置为 falseeditable 选项将被忽略。

multi_edit

可编辑或不可编辑的列表可以通过定义 multi_edit=1 来激活多编辑功能

default_order

覆盖视图的排序,替换模型的排序 (_order 模型属性)。值是一个 逗号分隔的字段列表,后缀为 desc 表示按相反顺序排序:

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

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

{$name} 可以是 bffont-weight: bold),itfont-style: italic),或任何 bootstrap contextual colordangerinfomutedprimarysuccesswarning)。

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

shorthand for invisible attrs: a list of states, comma separated, requires that the model has a state field and that it is used in the view.

如果记录不在所列状态之一,则使按钮``invisible``

危险

在使用 attrsstates 结合时,可能会导致意外的结果,因为域会与逻辑 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} 可以是 bffont-weight: bold),itfont-style: italic),或任何 bootstrap contextual colordangerinfomutedprimarysuccesswarning)。

nolabel

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

optional

使列变为可选项。如果设置为“隐藏”,则列默认隐藏。如果设置为“显示”,则列默认可见。用户的可见性选择存储在浏览器的本地存储中。

注解

如果列表视图是 editable ,则来自 form view 的任何字段属性也是有效的,并且将在设置内联表单视图时使用。

注解

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

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

注解

当列表视图被分组时,数值字段会被聚合并显示在每个组中。此外,如果一个组中有太多的记录,会在组行右侧出现一个分页器。因此,在列表视图可以被分组的情况下,不建议将数值字段放在最后一列(但对于表单视图中的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

在当前列表中添加一个按钮以创建新元素。

注解

如果定义了任何 create ,它将覆盖默认的“添加行”按钮。

支持以下属性:

string (required)

按钮上显示的文本。

context

当检索新记录的默认值时,此上下文将与现有上下文合并。

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

以下示例将通过将默认的“添加一行”按钮替换为3个新按钮:“添加产品”,“添加部分”和“添加注释”来进行覆盖。

“添加产品”将把“显示类型”字段设置为默认值。

另外两个按钮将分别将字段“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

由于历史原因,它起源于树形视图,后来被重新用于更多的表格/列表类型显示

地图

Enterprise feature

此视图能够在地图上显示记录和它们之间的路线。记录由图钉表示。它还允许在与记录图钉相关联的弹出窗口中可视化模型中的字段。

注解

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

API

视图使用位置数据平台的API来获取瓦片(地图的背景),进行地理转发(将地址转换为一组坐标)和获取路线。视图实现了两个API,OpenStreetMap和MapBox。默认情况下使用OpenStreetMap,能够获取 瓦片 和进行 地理转发。该API不需要令牌。只要在常规设置中提供了有效的 MapBox 令牌,视图就会切换到MapBox API。该API更快,并允许计算路线。可以通过 注册 MapBox 来获取令牌。

结构组件

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

res_partner

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

default_order

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

routing

如果为 1 ,则显示记录之间的路线。视图需要有效的 MapBox 令牌和至少两个已定位的记录(即记录具有 res.partner many2one 并且合作伙伴具有地址或有效坐标)。

hide_name

如果 1 隐藏名称在弹出窗口的针(默认: 0 )。

hide_address

如果 1 隐藏地址从弹出窗口的图钉 (默认: 0)。

hide_title

如果 1 从固定列表中隐藏标题(默认值: 0 )。

panel_title

在固定列表中显示的标题字符串。如果未提供,则标题为操作的名称或如果视图不在操作中,则为“Items”。

limit

最大获取记录数(默认值:80)。必须是正整数。

The <map> element can contain multiple <field> elements. Each <field> element is interpreted as a line in the pin’s popup. The field’s attributes are the following:

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>,可以使用以下属性:

disable_linking (optional)

将其设置为 1 以删除表格单元格与列表视图的链接。

display_quantity (optional)

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

default_order (optional)

在视图中使用的默认顺序(升序或降序)的度量名称。

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

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

name (mandatory)

视图中要使用的字段名称。如果用于分组(而不是聚合),请使用此字段。

string (optional)

将用于在数据透视表视图中显示字段的名称,覆盖字段的默认 Python 字符串属性。

type (optional)

指示该字段应该作为分组标准还是在组内作为聚合值使用。可能的值为:

row (default)

按指定字段分组,每个组都有自己的行。

col

创建列分组

measure

在分组内聚合的字段

interval

在日期和日期时间字段上,按指定的间隔(dayweekmonthquarteryear)进行分组,而不是按照具体的日期时间(固定秒分辨率)或日期(固定天分辨率)进行分组。

invisible (optional)

如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中(对于不适合聚合的字段非常有用,例如不同单位的字段,例如 € 和 $)。

度量值是从模型字段自动生成的;只使用可聚合字段。这些度量值也按字段字符串的字母顺序排序。

警告

与图形视图一样,数据透视表在数据库内容上聚合数据,这意味着非存储函数字段不能在数据透视表视图中使用。

在透视视图中, field 可以有一个 widget 属性来指定其格式。该小部件应该是一个字段格式化程序,其中最有趣的是 datedatetimefloat_timemonetary

例如,可以将时间表透视图定义为:

<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视图(在操作内打开),在这种情况下,它们应该被定义为具有显式 类型 (它不能被推断)和模型的常规视图。

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) prepares the rendering context specific to 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之间)来描述默认分组的顺序。例如,如果 foobar 指代两个分组

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

具有先激活 bar 然后激活 foo 的效果。