视图架构

通用架构

视图的架构由 JavaScript 框架解析的 XML 数据定义。

对于大多数视图,都有一个 *.rng 文件定义属性和可能的架构。某些视图不受此类文件约束,要么是因为它们接受 HTML 内容,要么是出于性能原因。

注解

当前上下文和用户访问权限可能会影响视图功能。

参见

视图记录

Python 表达式

在评估节点属性时(例如 readonly 修饰符),可以提供一个 Python 表达式,该表达式将在可访问以下变量的环境中执行:

  • 当前视图中所有字段的名称,包含当前记录的值,但 列表视图 中的 column_invisible 除外;关系字段以 ID 列表形式提供;

  • 当前记录的 ID;

  • parent:引用容器的记录;仅在 关系字段 的子视图中可用;

  • context (字典):当前视图的上下文;

  • uid (整数):当前用户的 ID;

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

  • now (字符串):当前本地日期时间,格式为 YYYY-MM-DD hh:mm:ss

Example

<field name="field_a" readonly="True"/>
<field name="field_b" invisible="context.get('show_me') and field_a == 4"/>

Example

<field name="field_a"/>
<field name="x2m">
    <!-- sub-view -->
    <form>
        <field name="field_b" invisible="parent.field_a"/>
    </form>
</field>

表单

表单视图用于显示单个记录的数据。它们由常规的 HTML 组成,并包含额外的语义和结构组件。

表单视图的根元素是 form

<form>
    ...
</form>

根属性

可以向根元素 form 添加可选属性以自定义视图。

string

视图标题。仅当您打开一个没有名称且目标为 new 的操作时(打开对话框)才会显示。

要求

可选

类型

字符串

默认值

''

create

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

要求

可选

类型

bool

默认值

True

edit

在视图中禁用/启用记录编辑功能。

要求

可选

类型

bool

默认值

True

duplicate

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

要求

可选

类型

bool

默认值

True

delete

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

要求

可选

类型

bool

默认值

True

js_class

webclient将实例化的JavaScript组件的名称,而不是表单视图。

要求

可选

类型

字符串

默认值

''

disable_autofocus

禁用视图中第一个字段的自动聚焦。

要求

可选

类型

bool

默认值

False

语义组件

语义组件与 Odoo 系统集成,并允许与其进行交互。

表单视图接受以下子语义组件:字段标签按钮讨论附件

占位符用全大写字母表示。

field:显示字段值

field 元素渲染(并可能允许编辑)当前记录的单个字段。

在表单视图中多次使用同一个字段是支持的,这些字段可以接收不同的 invisiblereadonly 属性值。这些字段可能具有相同的值,但可以以不同的方式显示。然而,当多个字段存在且 required 属性值不同时,行为无法保证。

<form>
    <field name="FIELD_NAME"/>
</form>

field 元素可以具有以下属性:

name

要渲染的字段名称。

要求

必填

类型

字符串

widget

用于表示字段的小部件。所选小部件可以改变字段的渲染方式和/或编辑方式。它引用注册到 fields 注册表中的 JavaScript 实现(一个 Owl 组件)。

要求

可选

类型

字符串

id

节点 ID。当视图中有多个相同字段的实例时非常有用(参见 label:显示字段标签)。

要求

可选

类型

字符串

默认值

字段名称

string

字段的标签。

要求

可选

类型

字符串

默认值

模型字段的 string 属性

help

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

要求

可选

类型

字符串

默认值

''

options

字段小部件的配置选项(包括默认小部件),以评估为字典的 Python 表达式形式提供。

对于关系字段,以下选项可用:no_createno_quick_createno_openno_create_edit

Example

<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'FIELD_NAME', 'no_quick_create': True}"/>
要求

可选

类型

Python 表达式

默认值

{}

readonly

字段是否可以由用户修改(False)或为只读(True),作为一个评估为布尔值的 Python 表达式。

Example

<field name="fname_a" readonly="True"/>
<field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
要求

可选

类型

Python 表达式

默认值

False

required

字段是否可以留空(False)或必须设置(True),作为一个评估为布尔值的 Python 表达式。

Example

<field name="fname_a" required="True"/>
<field name="fname_b" required="fname_c != 3"/>
要求

可选

类型

Python 表达式

默认值

False

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

domain

在显示现有记录以供选择时应用的过滤条件,以评估为 的 Python 表达式形式提供。

Example

<field name="fname" domain="[('fname_a', '=', parent.fname_b)]"/>
要求

可选

类型

Python 表达式

默认值

[]

范围

关系字段

context

在获取可能值以及创建或搜索记录时使用的上下文,以评估为字典的 Python 表达式形式提供。

Example

<field name="fname" context="{
    'TYPE_view_ref': 'ADDON.MODEL_view_TYPE',
    'group_by': 'FIELD_NAME',
    'default_FIELD_NAME': ANY,
    'search_default_FIELD_NAME': True,
    'OTHER_BUSINESS_KEY': ANY,
  }"/>
要求

可选

类型

Python 表达式

默认值

{}

范围

关系字段

nolabel

是否应隐藏字段标签。

要求

可选

类型

bool

默认值

False

范围

作为 group 元素直接子元素的字段

placeholder

字段上显示的帮助消息。它可以在复杂表单中替代字段标签。然而,它 不应 是数据示例,因为用户可能会将占位符文本与已填写字段混淆。

要求

可选

类型

字符串

默认值

''

mode

用于字段关联记录的显示模式(视图类型)的逗号分隔列表。允许的模式有:listformkanbangraph

要求

可选

类型

字符串

默认值

列表

范围

One2manyMany2many 字段

class

设置在生成元素上的 HTML 类

样式使用 Bootstrap 框架和 UI 图标。常见的 Odoo 类包括:

  • oe_inline:防止字段后通常的换行,并限制其跨度;

  • oe_leftoe_right:将元素 浮动 到对应的方向;

  • oe_read_onlyoe_edit_only:仅在对应的表单模式下显示该元素;

  • oe_avatar:用于图像字段,将图像显示为“头像”(最大 90x90 的正方形);

  • oe_stat_button:定义一种特殊的渲染方式,动态显示信息,同时可点击以触发操作。

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
要求

可选

类型

字符串

默认值

''

filename

提供文件名称的相关字段的名称。

要求

可选

类型

字符串

默认值

''

范围

Binary 字段

password

字段是否存储密码,因此其数据不应显示。

要求

可选

类型

bool

默认值

False

范围

Char 字段

kanban_view_ref

在移动环境中选择记录时应使用的特定看板 视图记录 的 XMLID。

要求

可选

类型

字符串

默认值

''

范围

关系字段

default_focus

视图打开时字段是否获得焦点。它只能应用于视图中的一个字段。

要求

可选

类型

bool

默认值

False

注解

关系字段 节点可以包含特定的子视图。

Example

<field name="children_ids">
   <list>
      <field name="name"/>
   </list>
   <form>
      <field name="id"/>
      <field name="name"/>
   </form>
</field>

label:显示字段标签

字段 组件未直接放置在 内部,或者设置了其 nolabel 属性时,字段的标签不会自动与其值一起显示。label 组件是手动显示字段标签的替代方法。

<form>
    <div class="col col-md-auto">
        <label for="FIELD_NAME" string="LABEL"/>
        <div>
            <field name="FIELD_NAME" class="oe_inline"/>
        </div>
    </div>
</form>

label 元素可以具有以下属性:

for

与标签关联的字段的引用。它可以是字段的名称,也可以是其 ID(设置在 字段 上的 id 属性)。

当视图中有多个相同字段的实例,并且有多个与这些字段节点关联的 label 组件时,这些标签必须具有唯一的 for 属性;在这种情况下,引用相应字段节点的 id 属性。

要求

必填

类型

字符串

string

要显示的标签。

要求

可选

类型

字符串

默认值

来自模型字段定义的字段标签

class

设置在生成元素上的 HTML 类

样式使用 Bootstrap 框架和 UI 图标。常见的 Odoo 类包括:

  • oe_inline:防止字段后通常的换行,并限制其跨度;

  • oe_leftoe_right:将元素 浮动 到对应的方向;

  • oe_read_onlyoe_edit_only:仅在对应的表单模式下显示该元素;

  • oe_avatar:用于图像字段,将图像显示为“头像”(最大 90x90 的正方形);

  • oe_stat_button:定义一种特殊的渲染方式,动态显示信息,同时可点击以触发操作。

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

button:显示操作按钮

<form>
    <button type="object" name="ACTION" string="LABEL"/>
    <button type="object" name="ACTION" icon="FONT_AWESOME"/>
</form>

button 元素可以具有以下属性:

type

按钮的类型,指示其行为方式。它可以有两个不同的值:

object

在视图的模型上调用方法。按钮的 name 是使用当前记录 ID 和当前 context 调用的方法。

action

加载并执行一个 ir.actions 操作记录。按钮的 name 是要加载的操作的 XMLID。context 会扩展为视图的模型(作为 active_model)和当前记录(作为 active_id)。

Example

<button type="object" name="action_create_new" string="Create document"/>
<button type="action" name="addon.action_create_view" string="Create and Edit"/>
要求

如果未设置 special 属性,则为必填项

类型

字符串

name

如果 typeobject,则为要调用的方法。如果 typeaction,则为要加载的操作的 XMLID,可以是原始格式或 %(XMLID)d 格式。

要求

可选

类型

字符串

默认值

''

string

如果没有 icon,则为按钮的文本;否则为图标的 alt 文本。

Example

<button type="object" name="action_create_new" string="Create document"/>
要求

可选

类型

字符串

默认值

''

icon

用于显示按钮的图标。有关参考列表,请参阅 图标

Example

<button type="object" name="remove" icon="fa-trash"/>
要求

可选

类型

字符串

默认值

''

help

当鼠标悬停时显示的工具提示消息。

Example

<button type="object" name="remove" icon="fa-trash" help="Revoke"/>
要求

可选

类型

字符串

默认值

''

context

在执行按钮调用时,合并到视图上下文中的上下文,作为一个评估为字典的 Python 表达式。

Example

<button name="button_confirm" type="object" context="{'BUSINESS_KEY': ANY}" string="LABEL"/>
要求

可选

类型

Python 表达式

默认值

{}

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

class

设置在生成元素上的 HTML 类

样式使用 Bootstrap 框架和 UI 图标。常见的 Odoo 类包括:

  • oe_inline:防止字段后通常的换行,并限制其跨度;

  • oe_leftoe_right:将元素 浮动 到对应的方向;

  • oe_read_onlyoe_edit_only:仅在对应的表单模式下显示该元素;

  • oe_avatar:用于图像字段,将图像显示为“头像”(最大 90x90 的正方形);

  • oe_stat_button:定义一种特殊的渲染方式,动态显示信息,同时可点击以触发操作。

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
要求

可选

类型

字符串

默认值

''

special

对话框中打开的表单视图中按钮的行为。它可以有两个不同的值:

save

保存记录并关闭对话框。

cancel

关闭对话框而不保存。

Example

<button special="cancel" icon="fa-trash"/>
要求

可选

类型

字符串

默认值

''

confirm

在执行按钮操作之前显示(并由用户确认)的确认消息。

Example

<button name="action_destroye_gate" string="Send the goa'uld" type="object" confirm="Do you confirm the action?"/>
要求

可选

类型

字符串

默认值

''

data-hotkey

绑定到按钮的快捷键(keyboard_shortcut,类似于 accesskey)。当按下 alt 键与选定字符组合,或按下 shift 键与选定字符组合(当值前缀为 shift+ 时)时启用。

Example

<button type="object" name="action_confirm" string="Confirm" data-hotkey="c"/>
<button type="object" name="action_tear" string="Tear the sheet" data-hotkey="shift+k"/>
要求

可选

类型

字符串

默认值

''

讨论小部件

讨论小部件 是一种通信和日志工具,允许直接从记录(任务、订单、发票、事件、笔记等)发送电子邮件给同事和客户。

当模型继承 mail.thread 混合类时,它通过带有 oe_chatter 类的 div 元素添加。

Example

<form>
    <sheet>
        ...
    </sheet>
    <div class="oe_chatter">
        <field name="message_follower_ids"/>
        <field name="activity_ids"/>
        <field name="message_ids" options="OPTIONS"/>
    </div>
</form>

附件预览小部件

附件预览小部件通过一个带有 o_attachment_preview 类的 div 元素添加。

Example

<form>
    <sheet>
        ...
    </sheet>
    <div class="o_attachment_preview"/>
<form>

结构组件

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

表单视图接受以下子结构组件: 表单页笔记本换行分隔符头部尾部按钮容器标题容器

占位符用全大写字母表示。

group:定义列布局

group 元素用于定义表单中的列布局。默认情况下,组定义 2 列,且组的大多数直接子元素占用一列。

作为组的直接子元素的 字段 默认显示一个 label,并且标签和字段本身的 colspan 均为 1

子元素水平排列(它们会尝试填满下一列后再换行)。

 <form>
     <group>
         ...
     </group>
</form>

group 元素可以具有以下属性:

string

组显示的标题。

要求

可选

类型

字符串

默认值

''

col

group 中的列数。

要求

可选

类型

int

默认值

2

colspan

子元素占用的列数。

要求

可选

类型

int

默认值

1

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

可能的结构及其渲染表示

../../../_images/form_group.svg
<group>
    <field name="a" string="custom"/>
    <field name="b"/>
</group>
<group string="title 1">
    <group string="title 2">
        <field name="c"/>
        <field name="d"/>
    </group>
    <group>
        <field name="e"/>
        <field name="f"/>
        <field name="g"/>
    </group>
</group>
<group col="12">
    <group colspan="8">
        <field name="h"/>
    </group>
    <group colspan="4">
        <field name="i"/>
    </group>
</group>

sheet:使布局更具响应性

sheet 元素可以用作 表单 根元素的直接子元素,以实现更窄且更具响应性的表单布局(居中页面、边距等)。它通常包含 元素。

<form>
    <sheet>
        ...
    </sheet>
</form>

notebookpage:添加带标签的部分

notebook 元素定义了一个带标签的部分。每个标签通过一个 page 子元素定义。

notebook 元素不应放置在 group 元素内。

<form>
    <notebook>
        <page string="LABEL">
            ...
        </page>
    </notebook>
</form>

page 元素可以具有以下属性:

string

标签的标题。

要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

可能的结构及其渲染表示

../../../_images/form_notebook.svg
<form>
    <notebook>
        <page string="Page1">
            ...
        </page>
        <page string="Page2">
            ...
        </page>
    </notebook>
</form>

newline:开始新的组行

newline 元素用于 元素内部,以提前结束当前行并立即切换到新行,而无需事先填充剩余列。

<form>
    <group>
        ...
        <newline/>
        ...
    </group>
</form>

可能的结构及其渲染表示

../../../_images/form_newline.svg
<form>
    <group string="Title 1">
        <group string="Title 1.1">...</group>
        <newline/>
        <group string="Title 1.2">...</group>
        <group string="Title 1.3">...</group>
    </group>
</form>

separator:添加水平间距

separator 元素在组内的元素之间添加垂直间距。

<form>
    ...
    <separator/>
    ...
</form>

<separator> 元素可以具有以下属性:

string

作为部分标题的标题。

要求

可选

类型

字符串

默认值

''

可能的结构及其渲染表示

../../../_images/form_separator.svg
<form>
    <group>
        <FIELD/>
        <separator string="Title 1"/>
        <FIELD/>
        <group>
            <FIELD/>
            <separator string="Title 2"/>
            <FIELD/>
        </group>
        <group>
            <FIELD/>
            <FIELD/>
        </group>
    </group>
</form>

小技巧

separator 元素可用于在同一内部 group 元素内的元素之间实现视觉分隔,同时保持它们的水平对齐。

header:显示工作流按钮和状态

header 元素与 sheet 元素结合使用时,提供了一个位于 sheet 之上的全宽位置,通常用于显示工作流 按钮 元素以及渲染为状态小部件的 字段 元素。

<form>
    <header>
        <BUTTONS/>
    </header>
    <sheet>
        ...
    </sheet>
</form>

Example

<header>
    <button string="Reset" type="object" name="set_draft" invisible="state != 'done'"/>
    <field name="state" widget="statusbar" statusbar_visible="draft,posted" options="{'clickable': 1}"/>
</header>

按钮容器

可以通过带有 button_box 类的 div 元素创建一个 按钮 元素容器。

<form>
    <div name="button_box">
        <BUTTONS/>
    </div>
<form>

可能的结构及其渲染表示

../../../_images/form_button_box.svg
<form>
    <div name="button_box">
        <button type="edit" name="edit" icon="fa-edit" string="Button1"/>
        <button type="object" name="my_action" icon="fa-dollar">
            <field name="total_inv" widget="statinfo" string="Invoices"/>
        </button>
    </div>
<form>

标题容器

可以通过带有 oe_title 类的 div 元素创建一个标题 字段 元素容器。

<form>
    <sheet>
        <div class="oe_title">
            <h1><FIELD/></h1>
        </div>
    </sheet>
<form>

设置

设置视图是 表单 视图的一种定制。它们用于在集中位置显示设置。与通用表单视图不同的是,它们包含搜索栏和侧边栏。

Example

<app string="CRM" name="crm">
    <setting type="header" string="Foo">
        <field name="foo" title="Foo?."/>
        <button name="nameAction" type="object" string="Button"/>
    </setting>
    <block title="Title of group Bar">
        <setting help="this is bar" documentation="/applications/technical/web/settings/this_is_a_test.html">
            <field name="bar"/>
        </setting>
        <setting string="This is Big BAR" company_specific="1">
            <field name="bar"/>
        </setting>
    </block>
    <block title="Title of group Foo">
        <setting string="Personalize setting" help="this is full personalize setting">
            <div>This is a different setting</div>
        </setting>
    </block>
</app>

组件

设置视图接受 表单 视图的 字段标签按钮 元素,还接受三个额外的子元素:应用设置

占位符用全大写字母表示。

app:声明应用程序

app 元素用于在设置视图中声明应用程序。它会在视图的侧边栏中创建一个带有应用程序图标的条目,并在搜索时充当分隔符。

<form>
    <app string="NAME" name="TECHNICAL_NAME">
    ...
    </app>
</form>

app 元素可以具有以下属性:

string

应用程序的名称。

要求

必填

类型

字符串

name

应用程序的技术名称(模块的名称)。

要求

必填

类型

字符串

logo

图标的 相对路径

要求

可选

类型

路径

默认值

通过 name 属性计算的路径:/name/static/description/icon.png

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

block:声明一组设置

block 元素用于声明一组设置。这组设置可以有一个标题和描述。

 <form>
     <app string="NAME" name="TECHNICAL_NAME">
         ...
         <block title="TITLE">
             ...
         </block>
         ...
     </app>
</form>

block 元素可以具有以下属性:

title

设置块的标题。可以在其值上进行搜索。

要求

可选

类型

字符串

默认值

''

help

设置块的描述。可以在其值上进行搜索。

要求

可选

类型

字符串

默认值

''

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

setting:声明设置

setting 元素用于声明设置本身。

设置中的第一个 字段 元素被用作主字段。如果它是布尔字段,则放置在左侧面板;否则放置在右侧面板的顶部。如果未定义 string 属性,该字段还会用于创建设置标签。

setting 元素还可以包含其他元素(例如 HTML)。所有这些元素都会渲染在右侧面板中。

<form>
    <app string="NAME" name="TECHNICAL_NAME">
        <block title="TITLE">
            ...
            <setting string="SETTING_NAME">
                ...
                <field name="FIELD_NAME"/>
                ...
            </setting>
            ...
        </block>
    </app>
</form>

<setting> 元素可以具有以下属性:

type

默认情况下,一个设置在两个面板(左侧和右侧)中视觉上分开,用于编辑给定的 字段。通过定义 type="header",会渲染一种特殊的设置。这种设置用于修改其他设置的作用范围。例如,在网站应用程序中,此设置用于指示其他设置适用于哪个网站。头部设置在屏幕上以横幅形式呈现。

要求

可选

类型

字符串

默认值

''

string

用作设置标签的文本。

要求

可选

类型

字符串

默认值

第一个字段的标签

title

用作工具提示的文本。

要求

可选

类型

字符串

默认值

''

help

设置的描述。该文本显示在设置标签下方(带有 text-muted 类)。

要求

可选

类型

字符串

默认值

''

company_dependent

设置是否特定于公司。如果设置,则会在设置标签旁边显示一个图标。

它仅接受值 '1'

要求

可选

类型

字符串

默认值

''

documentation

设置文档的 路径。如果设置,则会在设置标签旁边显示一个可点击的图标。路径可以是绝对路径或 相对路径。如果是后者,则相对于 https://www.odoo.com/documentation/<version>

要求

可选

类型

路径_

默认值

''

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

列表

列表视图的根元素是 list`(以前的名称为 `tree)。

可能的结构及其渲染表示

../../../_images/list.svg
<list>
    ...
</list>

根属性

可以向根元素 list 添加可选属性以自定义视图。

string

视图标题。仅当您打开一个没有名称且目标为 new 的操作时(打开对话框)才会显示。

要求

可选

类型

字符串

默认值

''

create

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

要求

可选

类型

bool

默认值

True

edit

在视图中禁用/启用记录编辑功能。

要求

可选

类型

bool

默认值

True

delete

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

要求

可选

类型

bool

默认值

True

import

禁用/启用从视图中的数据导入记录。

要求

可选

类型

bool

默认值

True

export_xlsx

禁用/启用将记录导出到视图中的数据。

要求

可选

类型

bool

默认值

True

editable

使视图中的记录可就地编辑,并允许从列表的一行创建新记录。它可以有两个不同的值:

top

新记录从列表顶部创建。

bottom

新记录从列表底部创建。

内联 表单 视图的架构派生自列表视图。因此,大多数在表单视图字段和按钮上有效的属性也会被列表视图接受,但如果列表视图不可编辑,这些属性可能没有意义。

重要

如果 edit 属性设置为 False,则此行为将被禁用。

要求

可选

类型

字符串

默认值

''

multi_edit

激活多编辑功能,允许一次性将多个记录的字段更新为相同的值。

它仅接受值 '1'

要求

可选

类型

字符串

默认值

''

open_form_view

在每行末尾显示一个按钮,用于在表单视图中打开记录。

如果视图不可编辑,则无效。

要求

可选

类型

bool

默认值

False

default_group_by

如果没有通过操作或当前的 搜索 指定分组,则记录应默认按其分组的字段名称。

要求

可选

类型

字符串

默认值

''

default_order

一个以逗号分隔的字段名称列表,用于覆盖通过 _order 属性在模型中定义的排序顺序。

要反转某个字段的排序顺序,请在其后添加后缀 desc,并用空格分隔。

Example

<list default_order="sequence,name desc">
    ...
</list>
要求

可选

类型

字符串

默认值

''

decoration-<style>

应用于匹配记录行的样式,以评估为布尔值的 Python 表达式形式提供。

<style> 必须替换为以下之一:bf`(粗体)、`it`(斜体)、`infowarningdangermutedprimarysuccess

Example

<list decoration-danger="field_qty &gt; field_limit">
    ...
</list>
要求

可选

类型

Python 表达式

默认值

False

limit

页面的默认大小。它必须严格为正。

要求

可选

类型

int

默认值

列表视图为 80,表单视图中的 X2many 列表为 40

groups_limit

当列表视图分组时,页面上的默认组数。它必须严格为正。

要求

可选

类型

int

默认值

列表视图为 80,表单视图中的 X2many 列表为 40

expand

当列表视图分组时,第一级组是否应默认展开。

警告

这可能会很慢,具体取决于组的数量。

要求

可选

类型

bool

默认值

False

sample

如果当前模型未找到任何记录,视图是否应填充一组示例记录。

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

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

要求

可选

类型

bool

默认值

False

组件

列表视图接受以下子元素:字段按钮分组头部控制和创建

占位符用全大写字母表示。

field:显示字段值

field 元素将所有当前记录的单个字段渲染为一列(可能允许编辑)。

在列表视图中多次使用同一个字段不受支持。

<list>
    <field name="FIELD_NAME"/>
</list>

field 元素可以具有以下属性:

name

要渲染的字段名称。

要求

必填

类型

字符串

widget

用于表示字段的小部件。所选小部件可以改变字段的渲染方式和/或编辑方式。它引用注册到 fields 注册表中的 JavaScript 实现(一个 Owl 组件)。

要求

可选

类型

字符串

string

字段的标签。

要求

可选

类型

字符串

默认值

模型字段的 string 属性

optional

使字段的可见性可选。字段的列可以通过视图头部的按钮隐藏或显示。

它可以有两个不同的值:

show

字段默认显示。

hide

字段默认隐藏。

Example

<field name="fname_a" optional="show"/>
<field name="fname_b" optional="hide"/>
要求

可选

类型

字符串

readonly

字段是否可以由用户修改(False)或为只读(True),作为一个评估为布尔值的 Python 表达式。

Example

<field name="fname_a" readonly="True"/>
<field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
要求

可选

类型

Python 表达式

默认值

False

required

字段是否可以留空(False)或必须设置(True),作为一个评估为布尔值的 Python 表达式。

Example

<field name="fname_a" required="True"/>
<field name="fname_b" required="fname_c != 3"/>
要求

可选

类型

Python 表达式

默认值

False

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

column_invisible

列是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

invisible 不同,它会影响整个列,并且在评估时不包含子树的值。

Example

<field name="product_is_late" column_invisible="parent.has_late_products == False"/>
<button type="object" name="action_confirm" column_invisible="context.get('hide_confirm')"/>
要求

可选

类型

Python 表达式

默认值

False

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

decoration-<style>

应用于匹配记录字段的样式,以评估为布尔值的 Python 表达式表示。

<style> 必须替换为以下之一:bf`(粗体)、`it`(斜体)、`infowarningdangermutedprimarysuccess

Example

<field name="name" decoration-bf="1"/>
<field name="quantity" decoration-info="state == 'draft'"/>
要求

可选

类型

Python 表达式

默认值

False

sum, avg

要在列底部显示的聚合值。聚合仅计算当前显示的记录。聚合操作必须与相应字段的 aggregator 匹配。

Example

<field name="sent" sum="Total" />
<field name="clicks_ratio" avg="Average"/>
要求

可选

类型

字符串

默认值

''

width

列表视图总是尝试在列之间优化可用空间。对于某些字段类型,这是通过强制设置宽度来实现的,具体取决于字段类型。例如,我们确切知道显示日期所需的像素数量,因此可以确保日期字段的列不会占用超过严格必要的空间,从而为其他列留出多余的空间。然而,框架无法猜测每种字段类型的适当宽度。例如,字符字段可以用于编码大值或3个字母的国家代码。在后一种情况下,可以直接在架构中设置宽度(例如 width="40px")。它表示渲染单元格内值所需的宽度(始终以像素为单位)。列的宽度将是给定值与单元格左右内边距的总和。

要求

可选

类型

字符串

默认值

''

nolabel

字段的列标题是否应保持为空。如果设置,则该列将不可排序。

它仅接受值 '1'

要求

可选

类型

字符串

默认值

''

注解

当列表视图分组时,数值字段会被聚合并为每个组显示。此外,如果一个组中有太多记录,分页器会出现在组行的右侧。因此,在列表视图可能分组的情况下,将数值字段放在最后一列是一个不好的做法。然而,这对表单视图中的 X2many 字段没有问题,因为它们无法分组。

可能的结构及其渲染表示

../../../_images/list_field.svg
<list>
    <field name="name" string="My Custom Name"/>
    <field name="amount" sum="Total"/>
    <field name="currency_id"/>
    <field name="tax_id"/>
</list>

button:显示操作按钮

<list>
    <button type="object" name="ACTION" string="LABEL"/>
    <button type="object" name="ACTION" icon="FONT_AWESOME"/>
</list>

button 元素可以具有以下属性:

type

按钮的类型,指示其行为方式。它可以有两个不同的值:

object

在视图的模型上调用方法。按钮的 name 是使用当前记录 ID 和当前 context 调用的方法。

action

加载并执行一个 ir.actions 操作记录。按钮的 name 是要加载的操作的 XMLID。context 会扩展为视图的模型(作为 active_model)和当前记录(作为 active_id)。

Example

<button type="object" name="action_create_new" string="Create document"/>
<button type="action" name="addon.action_create_view" string="Create and Edit"/>
要求

如果未设置 special 属性,则为必填项

类型

字符串

name

如果 typeobject,则为要调用的方法。如果 typeaction,则为要加载的操作的 XMLID,可以是原始格式或 %(XMLID)d 格式。

要求

可选

类型

字符串

默认值

''

string

如果没有 icon,则为按钮的文本;否则为图标的 alt 文本。

Example

<button type="object" name="action_create_new" string="Create document"/>
要求

可选

类型

字符串

默认值

''

icon

用于显示按钮的图标。有关参考列表,请参阅 图标

Example

<button type="object" name="remove" icon="fa-trash"/>
要求

可选

类型

字符串

默认值

''

help

当鼠标悬停时显示的工具提示消息。

Example

<button type="object" name="remove" icon="fa-trash" help="Revoke"/>
要求

可选

类型

字符串

默认值

''

context

在执行按钮调用时,合并到视图上下文中的上下文,作为一个评估为字典的 Python 表达式。

Example

<button name="button_confirm" type="object" context="{'BUSINESS_KEY': ANY}" string="LABEL"/>
要求

可选

类型

Python 表达式

默认值

{}

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

column_invisible

列是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

invisible 不同,它会影响整个列,并且在评估时不包含子树的值。

Example

<field name="product_is_late" column_invisible="parent.has_late_products == False"/>
<button type="object" name="action_confirm" column_invisible="context.get('hide_confirm')"/>
要求

可选

类型

Python 表达式

默认值

False

class

设置在生成元素上的 HTML 类

样式使用 Bootstrap 框架和 UI 图标。常见的 Odoo 类包括:

  • oe_inline:防止字段后通常的换行,并限制其跨度;

  • oe_leftoe_right:将元素 浮动 到对应的方向;

  • oe_read_onlyoe_edit_only:仅在对应的表单模式下显示该元素;

  • oe_avatar:用于图像字段,将图像显示为“头像”(最大 90x90 的正方形);

  • oe_stat_button:定义一种特殊的渲染方式,动态显示信息,同时可点击以触发操作。

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
要求

可选

类型

字符串

默认值

''

可能的结构及其渲染表示

../../../_images/list_button.svg
<list>
    <field name="name"/>
    <button type="edit" name="edit" icon="fa-edit" title="Edit"/>
    <button type="object" name="my_method" string="Button1" column_invisible="context.get('hide_button')" invisible="amount &gt; 3"/>
    <field name="amount"/>
    <field name="currency_id"/>
    <field name="tax_id"/>
</list>

groupby:定义组标题

groupby 元素用于在对 Many2one 字段进行分组时,通过 按钮 元素定义组标题。它还接受 字段 元素,这些字段可用于修饰符。因此,这些字段属于 Many2one 的共模型。这些额外字段会批量获取。

<list>
    ...
    <groupby name="FIELD_NAME">
        <BUTTONS/>
        <FIELDS/>
    </groupby>
</list>

groupby 元素可以具有以下属性:

name

用作标题的 Many2one 字段的名称。

可以定义一个特殊的 按钮 元素,并设置 type="edit",以打开 Many2one 字段的表单视图。

要求

必填

类型

字符串

可能的结构及其渲染表示

../../../_images/list_groupby.svg
<list>
    <field name="name"/>
    <field name="amount"/>
    <field name="currency"/>
    <field name="tax_id"/>

    <groupby name="partner_id">
        <button type="edit" name="edit" icon="fa-edit" title="Edit"/>
        <field name="email"/>
        <button type="object" name="my_method" string="Button1" invisible="email == 'jhon@conor.com'"/>
    </groupby>
</list>

注解

groupby 元素内的字段仅用于获取和存储值,但永远不会显示。

header:显示工作流按钮

<list>
    <header>
        <BUTTONS/>
    </header>
    ...
</list>

header 元素接受以下子元素:

button

button 元素允许在控制面板中定义按钮。它与 列表视图中的按钮元素 相同,但在放置于 header 元素内时,它接受一个额外属性:

display

使按钮始终可用,而无需选择记录。

它仅接受值 always

Example

<header>
    <button name="toDoAlways" type="object" string="Always displayed" display="always"/>
    <button name="toDoSelection" type="object" string="Displayed if selection"/>
</header>
要求

可选

类型

字符串

默认值

''

可能的结构及其渲染表示

../../../_images/list_header.svg
<list>
    <header>
        <button type="object" name="to_draft" string="Button1" invisible="context.get('hide_button')"/>
    </header>
    <field name="name"/>
    <field name="amount"/>
    <field name="currency"/>
    <field name="tax_id"/>
</list>

controlcreate:添加内联创建按钮

control 元素定义了一个接受创建按钮的控制行。每个创建按钮通过 create 元素定义。

<list>
   <control>
       <create string="LABEL"/>
       <BUTTONS/>
    </control>
    ...
</list>

control 元素不接受任何属性。

create 元素可以具有以下属性:

string

按钮的文本。

要求

必填

类型

字符串

context

在执行按钮调用时,合并到视图上下文中的上下文,作为一个评估为字典的 Python 表达式。

要求

可选

类型

Python 表达式

默认值

{}

可能的结构及其渲染表示

../../../_images/list_control.svg
<list>
    <field name="name"/>
    <field name="amount"/>
    <field name="currency"/>
    <field name="tax_id"/>
    <control>
        <create string="Add a item"/>
        <create string="Add a section" context="{'default_type': 'section'}"/>
        <create string="Add a note" context="{'default_type': 'note'}"/>
    </control>
</list>

注解

使用 control 元素只有在列表视图位于 One2manyMany2many 字段内部时才有意义。如果定义了任何 create 元素,它将覆盖默认的 添加一行 按钮。

组件

搜索视图接受以下子元素:字段过滤器分隔符搜索面板

占位符用全大写字母表示。

field:基于字段值进行过滤

field 元素通过用户提供的值定义域或上下文。在生成搜索域时,字段域会彼此之间以及与过滤器通过 AND 运算符合并。

<search>
    <field name="FIELD_NAME"/>
</search>

field 元素可以具有以下属性:

name

要过滤的字段名称。

要求

必填

类型

字符串

string

字段的标签。

要求

可选

类型

字符串

默认值

模型字段的 string 属性

operator

默认情况下,字段生成形式为 [(name, operator, value)] 的域,其中 name 是字段的名称,value 是用户提供的值,可能会被过滤或转换(例如,用户需要提供选择字段值的 标签,而不是值本身)。

operator 属性允许覆盖默认运算符,该运算符取决于字段类型(例如,浮点字段为 =,字符字段为 ilike,多对一字段为 child_of)。

要求

可选

类型

字符串

默认值

=

filter_domain

用作字段搜索域的域,以评估为 的 Python 表达式形式表示。

它可以使用 self 变量将提供的值注入自定义域中。这可以用于生成比单独使用 operator 属性更灵活的域(例如,同时搜索多个字段)。

如果同时提供了 operatorfilter_domain 属性,则 filter_domain 优先。

要求

可选

类型

Python 表达式

默认值

[]

context

要合并到搜索视图目标视图上下文中的上下文,以评估为字典的 Python 表达式形式表示。

它可以包含用户提供的值,这些值在 self 变量下可用。

要求

可选

类型

Python 表达式

默认值

{}

domain

应用于支持自动完成的字段(例如,Many2one)的补全结果的过滤器。

要求

可选

类型

Python 表达式

默认值

[]

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

可能的结构及其渲染表示

../../../_images/search_field.svg
<search>
    <field name="name" string="My Custom Name"/>
    <field name="amount"/>
    <field name="currency_id"/>
    <field name="ref" filter_domain="[('name', 'like', self)]"/>
</search>

filter:创建预定义过滤器

filter 元素用于创建可以在搜索视图中切换的预定义过滤器。它允许向搜索上下文(传递给数据视图以进行搜索/过滤的上下文)添加数据,或将新部分追加到搜索过滤器中。

<search>
    <filter string="LABEL" domain="DOMAIN"/>
</search>

filter 元素可以具有以下属性:

name

过滤器的技术名称。它可以用于 默认启用它 或作为 继承钩子

要求

必填

类型

字符串

string

过滤器的标签。

要求

必填

类型

字符串

help

悬停过滤器时显示的工具提示。

要求

可选

类型

字符串

默认值

''

domain

作为搜索域的一部分附加到操作域的域。

要求

可选

类型

Python 表达式

默认值

[]

date

要过滤的 datedatetime 字段的名称。

当使用此属性时,它会在 过滤器 菜单的子菜单中创建一组可用的过滤器。这些过滤器是时间相关的,但并非动态的,因为它们的域是在控制面板实例化时评估的。

Example

<filter string="Creation Date" name="filter_create_date" date="create_date"/>

默认情况下,这些过滤器包含一个下拉菜单,其中包含不同的子过滤器,允许您按月、季度和年份进行过滤。此外,您可以创建允许使用域进行过滤的自定义子过滤器。这些自定义过滤器必须具有以下属性:namestringdomain

Example

<filter string="Creation Date" name="filter_create_date" date="create_date">
   <filter name="create_date_last_30_days" string="Last 30 Days" domain="[('create_date', '&gt;', datetime.datetime.combine(context_today() - relativedelta(days=30), datetime.time(23, 59, 59)).to_utc())]"/>
</filter>

请注意,以这种方式定义的所有自定义过滤器彼此之间以及与其他子过滤器是互斥的。

要求

可选

类型

字符串

默认值

''

start_month

日期过滤器下拉菜单中显示的最早月份,作为相对于当前月份的偏移量。

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" start_month="-3"/>

如果当前月份是二月,下拉菜单中可选择的最早月份将是十一月。

要求

可选

类型

int

默认值

-2

范围

具有非空 date 属性的过滤器

end_month

日期过滤器下拉菜单中显示的最晚月份,作为相对于当前月份的偏移量。

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" end_month="2"/>

如果当前月份是二月,下拉菜单中可选择的最晚月份将是三月。

要求

可选

类型

int

默认值

0

范围

具有非空 date 属性的过滤器

start_year

日期过滤器下拉菜单中显示的最早年份,作为相对于当前年份的偏移量。

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" start_year="-3"/>

如果当前年份是 2024 年,下拉菜单中可选择的最早年份将是 2021 年。

要求

可选

类型

int

默认值

-2

范围

具有非空 date 属性的过滤器

end_year

日期过滤器下拉菜单中显示的最晚年份,作为相对于当前年份的偏移量。

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" end_year="2"/>

如果当前年份是 2024 年,下拉菜单中可选择的最晚年份将是 2025 年。

要求

可选

类型

int

默认值

0

范围

具有非空 date 属性的过滤器

default_period

基于时间的过滤器(带有 date 属性)的默认周期。它必须是以下之一,或有效过滤器 ID 的逗号分隔列表。

有效的过滤器 ID 包括以下内容:

  • 第一季度第二季度第三季度第四季度

  • monthmonth-xmonth+x 中的一个,其中 x 是介于 start_monthend_month 之间的非零整数值。

  • yearyear-xyear+x 中的一个,其中 x 是介于 start_yearend_year 之间的非零整数值。

  • 在过滤器内定义的任何自定义过滤器的 name,前面加上 custom_

该过滤器必须在视图初始化时激活的默认过滤器集合中。

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" default_period="year,month-1"/>

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" default_period="custom_create_date_last_30_days">
   <filter name="create_date_last_30_days" string="Last 30 Days" domain="[('create_date', '&gt;', datetime.datetime.combine(context_today() - relativedelta(days=30), datetime.time(23, 59, 59)).to_utc())]"/>
</filter>
要求

可选

类型

字符串

默认值

month,如果不可用,则为最接近当前月份的值。

范围

具有非空 date 属性的过滤器

invisible

元素是否可见(False)或隐藏(True),作为一个评估为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 可用性:为了避免视图过载,并根据内容让用户更容易阅读。

  • 技术性:字段必须存在于视图中(仅设置为不可见即可),才能在 Python 表达式中使用。

Example

<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
要求

可选

类型

Python 表达式

默认值

False

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

context

合并到操作域中以生成搜索域的上下文

上下文键 group_by 设置为字段值,可用于定义在 分组依据 菜单中可用的分组。当字段类型为 datedatetime 时,过滤器会生成 分组依据 菜单的子菜单,并提供以下间隔选项:季度。当过滤器在视图初始化时激活的默认过滤器集合中时,默认情况下记录按月分组。可以通过使用语法 date_field:interval 更改此行为。

Example

<filter string="Category" name="groupby_category" context="{'group_by': 'category_id'}"/>
<filter string="Creation Date" name="groupby_create_date" context="{'group_by': 'create_date:week'}"/>

注解

read_groups 的结果按字段分组时可能会受到其 group_expand 属性的影响,从而在需要时显示空分组。更多信息,请参阅 Field

要求

可选

类型

Python 表达式

默认值

{}

小心

没有非过滤器元素分隔的过滤器序列被视为包容性组合:它们将通过 OR 组合,而不是通常的 AND

Example

<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>

state 字段为 draftdone 的记录将显示。

Example

<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('delay', '&lt;', 15)]"/>

state 字段为 draftdelay 字段小于 15 的记录将显示。

可能的结构及其渲染表示

../../../_images/search_filter.svg
<search>
    <filter string="My Custom Name" domain="[('name', 'ilike', 'AAA')]"/>
    <filter string="My orders" domain="[('user_id', '=', uid)]"/>
    <filter string="Category" context="{'group_by': 'category_id'}"/>
</search>

separator:分隔过滤器组

separator 元素用于在简单搜索视图中分隔 过滤器 组。对于更复杂的搜索视图,建议使用 group 元素。

<search>
    <FILTERS/>
    <separator/>
    <FILTERS/>
</search>

separator 元素不接受任何属性。

group:分隔过滤器组

group 元素用于在复杂的搜索视图中分隔 过滤器 组。在更简单的搜索视图中,它可以替代 separator 元素。

<search>
    <group>
        <FILTERS/>
    </group>
</search>

group 元素不接受任何属性。

searchpanel:显示搜索面板

searchpanel 元素在多记录视图的左侧显示一个搜索面板。它允许根据给定字段快速过滤数据。

<search>
    <searchpanel>
        <FIELDS/>
    </searchpanel>
</search>

searchpanel 元素仅接受 field 子元素。

作为 searchpanel 元素子元素的 field 元素可以具有以下属性:

name

要过滤的字段名称。

要求

必填

类型

字符串

string

字段的标签。

要求

可选

类型

字符串

默认值

模型字段的 string 属性

select

字段的行为和显示方式。它可以有两个不同的值:

one

最多只能选择一个值。支持的字段类型为 many2oneselection

multi

可以选择多个值。支持的字段类型为 many2onemany2manyselection

要求

可选

类型

字符串

默认值

one

groups

以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的 ! 操作符前缀来排除某些组。

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
要求

可选

类型

字符串

默认值

''

icon

字段的图标。

要求

可选

类型

字符串

默认值

''

color

字段的颜色。

要求

可选

类型

字符串

默认值

''

field 元素设置了 select=one 属性时,它可以具有以下附加属性:

hierarchize

子类别是否应出现在父类别下,还是在同一层次结构级别。

要求

可选

类型

bool

默认值

True

范围

Many2one 字段

field 元素设置了 select=multi 属性时,它可以具有以下附加属性:

enable_counters

如果记录计数器非零,是否计算并显示它。

小技巧

此属性的存在是为了避免影响性能。另一种解决性能问题的方法是重写 search_panel_select_rangesearch_panel_select_multi_range 方法。

要求

可选

类型

bool

默认值

False

expand

是否显示没有记录的类别和过滤器。

要求

可选

类型

bool

默认值

False

limit

字段要获取的最大值数量。如果达到限制,则不会在搜索面板上显示任何值,而是显示错误消息。如果设置为 0,则获取所有值。

要求

可选

类型

int

默认值

200

domain

记录必须满足的条件。

Example

<searchpanel>
    <field name="department_id"/>
    <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/>
</searchpanel>
要求

可选

类型

Python 表达式

默认值

[]

groupby

应在其上对值进行分组的字段名称。

要求

可选

类型

字符串

默认值

''

范围

Many2oneMany2many 字段

搜索默认值

可以通过操作的 context 使用 search_default_name 键配置搜索字段和过滤器。对于字段,值必须是要设置到字段的值;对于过滤器,必须是布尔值或数字。

Example

对于字段 foo 和过滤器 bar,以下操作上下文将在 acro 上搜索 foo 并默认启用 bar

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

可以使用数字值(介于 1 和 99 之间)定义默认 groupby 过滤器的顺序。

Example

对于两个 groupby 过滤器 foobar,以下操作上下文将首先启用 bar,然后启用 foo

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

看板

看板视图用作 看板 可视化工具:它们将记录显示为“卡片”,介于 列表表单 视图之间。

记录可以按列分组,用于工作流可视化或操作(例如任务或工作进度管理),也可以不分组(仅用于可视化记录)。

看板视图的根元素是 kanban

可能的结构及其渲染表示

../../../_images/kanban.svg
<kanban>
    ...
</kanban>

注解

看板视图加载并显示最多十列。之后的任何列都会被折叠,但用户仍然可以展开它们。

根属性

可以向根元素 kanban 添加可选属性以自定义视图。

string

视图标题。仅当您打开一个没有名称且目标为 new 的操作时(打开对话框)才会显示。

要求

可选

类型

字符串

默认值

''

create

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

要求

可选

类型

bool

默认值

True

edit

在视图中禁用/启用记录编辑功能。

要求

可选

类型

bool

默认值

True

delete

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

要求

可选

类型

bool

默认值

True

default_group_by

如果没有通过操作或当前的 搜索 指定分组,则记录应默认按其分组的字段名称。

要求

可选

类型

字符串

默认值

''

default_order

一个以逗号分隔的字段名称列表,用于覆盖通过 _order 属性在模型中定义的排序顺序。

要反转某个字段的排序顺序,请在其后添加后缀 desc,并用空格分隔。

Example

<list default_order="sequence,name desc">
    ...
</list>
要求

可选

类型

字符串

默认值

''

class

向视图的根 HTML 元素添加 HTML 类。

要求

可选

类型

字符串

默认值

''

examples

在分组看板视图中创建新列时,可以在 KanbanExamplesRegistry 中浏览的示例的键。

要求

可选

类型

字符串

默认值

''

group_create

添加新列 栏是否可见。

要求

可选

类型

bool

默认值

True

group_delete

是否可以通过齿轮菜单删除列。

要求

可选

类型

bool

默认值

True

group_edit

是否可以通过齿轮菜单编辑列。

要求

可选

类型

bool

默认值

True

groups_draggable

列是否可以重新排序。

要求

可选

类型

bool

默认值

True

records_draggable

当看板视图分组时,记录是否可以拖动。

要求

可选

类型

bool

默认值

True

archivable

当模型上定义了 active 字段时,属于某列的记录是否可以归档和取消归档。

要求

可选

类型

bool

默认值

True

quick_create

是否可以在不切换到表单视图的情况下创建记录。

要求

可选

类型

bool

默认值

当看板视图按 many2one、selection、char 或 boolean 字段分组时为 True,否则为 False

quick_create_view

使用快速创建记录时打开的 表单 视图的引用。

要求

可选

类型

字符串

默认值

''

on_create

点击 创建 时调用的自定义操作。

如果设置为 'quick_create',则使用快速创建记录。如果快速创建被禁用,则调用标准的创建操作。

要求

可选

类型

字符串

默认值

''

can_open

默认情况下,点击看板卡片会在表单视图中打开对应的记录。通过将属性 can_open 设置为 False 可以禁用此行为。

要求

可选

类型

bool

默认值

True

highlight_color

用于为看板卡片的左边框着色的整数字段名称。

要求

可选

类型

字符串

sample

如果当前模型未找到任何记录,视图是否应填充一组示例记录。

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

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

要求

可选

类型

bool

默认值

False

组件

看板视图接受以下子元素:模板字段头部进度条

templates:定义卡片结构

templates 元素用于定义结构化看板卡片的 QWeb 模板

卡片结构的定义可以拆分为多个模板以提高清晰度,但必须至少定义一个根 card 模板。

可以定义一个额外的模板:menu。如果定义了该模板,则它会渲染在一个下拉菜单中,可以通过卡片右上角的垂直省略号()切换。

模板使用 JavaScript QWeb 编写。

<kanban>
   <templates>
      <t t-name="card">
         <field name="name"/>
      </t>
   </templates>
</kanban>

警告

这些是 QWeb 模板,而不是 Owl 模板,这意味着像 t-on-click 这样的指令不可用。

字段

在这些模板中,field 元素用于渲染字段。它可以具有以下属性:

name

要渲染的字段名称。

要求

必填

类型

字符串

widget

用于表示字段的小部件。所选小部件可以改变字段的渲染方式和/或编辑方式。它引用注册到 fields 注册表中的 JavaScript 实现(一个 Owl 组件)。

要求

可选

类型

字符串

默认情况下,字段节点会被包含其格式化值的 span 替换,除非指定了 widget 属性,在这种情况下,其渲染和行为取决于相应的部件。widget 属性可以具有不同的值,包括:

handle

允许通过拖放重新排序记录,使用相应的字段作为排序依据。

kanban_color_picker

允许编辑颜色(整数)字段。结合根属性 highlight_color,可以编辑卡片的颜色。

请参阅 字段部分 以了解各种部件及其选项。

渲染上下文

看板模板通过 QWeb 引擎 渲染,它们拥有一个 渲染上下文,即模板中可用的一组变量,包含有用的信息和工具。以下是可用变量:

record

一个包含视图中所有字段的对象。每个字段有两个属性:valueraw_value。前者根据当前用户参数格式化,后者是原始值(例如,many2one 字段的 id)。这个对象非常有用,例如可以在 t-if 条件中使用字段值。为了显示目的,我们建议使用 <field> 标签。

Example

<kanban>
   <templates>
      <field name="is_company"/>
      <t t-name="card">
         <field name="name"/>
         <field t-if="!record.is_company.raw_value" name="parent_id">
      </t>
   </templates>
</kanban>
widget

一个包含 2 个键的对象,定义了用户可用的操作:

  • editable:如果用户可以编辑记录,则为 true,否则为 false;

  • deletable:如果用户可以删除记录,则为 true,否则为 false。

这有助于根据特定权限条件性地显示元素。

Example

<kanban>
   <templates>
      <t t-name="card">
         <field name="name"/>
      </t>
      <t t-name="menu">
         <a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
      </t>
   </templates>
</kanban>
context

当前上下文从打开看板视图的操作或嵌套看板视图的 one2many 或 many2many 字段传播而来。

read_only_mode

指示该视图为只读。

类型

bool

selection_mode

是否在选择 many2one 或 many2many 字段时打开看板视图(在移动环境中)。

类型

bool

luxon

luxon 对象,允许操作日期和时间字段值。

JSON

JavaScript 的 JSON 命名空间对象,包含一个 parse 方法,允许将 JSON 字段值解析为 JavaScript 对象。

部件

widget 元素允许在卡片内插入动态生成(通过 JavaScript)的 HTML。它有一个强制性的 name 属性,引用注册到 view_widgets 注册表中的 JavaScript 实现(一个 Owl 组件)。

请参阅 部件部分 以了解各种部件及其选项。

布局

可以使用标准 HTML 元素和 Bootstrap 工具类 轻松实现多种卡片布局。默认情况下,卡片是一个具有 column 方向的 弹性盒子容器

Example

<kanban>
   <templates>
      <t t-name="card">
         <field class="fw-bold fs-5" name="display_name"/>
         <field class="text-muted" name="parent_id"/>
         <field name="tag_ids" widget="many2many_tags"/>
      </t>
   </templates>
</kanban>

footer HTML 元素被设计为固定在卡片底部,并作为一个具有 row 方向的弹性盒子容器,从而可以轻松地在同一行上显示多个字段。

Example

<kanban>
   <templates>
      <t t-name="card">
         <field class="fw-bold fs-5" name="display_name"/>
         <field class="text-muted" name="parent_id"/>
         <field name="tag_ids" widget="many2many_tags"/>
         <footer>
            <field name="priority" widget="priority"/> <!-- bottom left corner -->
            <field class="ms-auto" name="activity_ids" widget="kanban_activity"/> <!-- bottom right corner -->
         </footer>
      </t>
   </templates>
</kanban>

要在卡片侧面显示某些内容(例如图像),可以使用 asidemain HTML 元素,并在卡片上添加 flex-row 类名。当没有 aside 时,main 节点是一个类似于卡片本身的弹性盒子容器。

Example

<kanban>
   <templates>
      <t t-name="card" class="flex-row">
         <aside>
            <field name="avatar_128" widget="image" alt="Avatar"/>
         </aside>
         <main class="ms-2">
            <field class="fw-bold fs-5" name="display_name"/>
            <field class="text-muted" name="parent_id"/>
            <field name="tag_ids" widget="many2many_tags"/>
            <footer>
               <field name="priority" widget="priority"/>
               <field class="ms-auto" name="activity_ids" widget="kanban_activity"/>
            </footer>
         </main>
      </t>
   </templates>
</kanban>

小技巧

aside 元素上设置的类名 o_kanban_aside_full 移除了内边距,从而使图像扩展到卡片的边界。

field:声明需要获取的更多字段

field 元素也可以在看板 模板 外部 使用。在这种情况下,它用于声明那些不会在卡片中显示但仍需获取的字段,例如因为它们的值在 t-if 条件中使用。

Example

<kanban>
   <templates>
      <field name="is_company"/>
      <t t-name="card">
         <field name="name"/>
         <field t-if="!record.is_company.raw_value" name="parent_id">
      </t>
   </templates>
</kanban>

header:在控制面板中显示按钮

header 元素用于在控制面板中插入自定义按钮。

<kanban>
   <header>
      ...
   </header>
   ...
</kanban>

header 元素仅接受 button 子元素,类似于 列表视图中的按钮 元素。

作为 header 元素子元素的 button 元素可以具有以下附加属性:

display

按钮的显示模式。它可以有两个不同的值:

display

按钮仅在选择了一些记录时显示;其操作应用于所选记录。

always

按钮始终显示,即使没有选择任何记录。

重要

由于目前无法在看板视图中选择记录,因此只有 always 显示模式可用。

Example

<header>
    <button name="toDoAlways" type="object" string="Always displayed" display="always"/>
    <button name="toDoSelection" type="object" string="Displayed if selection"/>
</header>
要求

可选

类型

字符串

默认值

display

progressbar:在列顶部显示进度条

progressbar 元素用于定义在分组看板视图的看板列顶部显示的进度条。

<kanban>
    <progressbar field="FIELD_NAME"/>
    ...
</kanban>

progressbar 元素可以具有以下属性:

field

进度条的子组所基于的字段名称。

要求

必填

类型

字符串

colors

进度条字段值与颜色值 mutedsuccesswarningdanger 的映射。

要求

必填

类型

JSON

sum_field

在进度条旁边显示的总和中使用的字段名称。如果未设置,则显示记录的总数。

要求

可选

类型

字符串

默认值

''

可能的结构及其渲染表示

../../../_images/kanban_progressbar.svg
<kanban>
    <progressbar field="activity_state"
                 colors="{'planned': 'success', 'today': 'warning', 'overdue': 'danger'}"
                 sum_field="expected_revenue"/>
    <templates>
        ...
    </templates>
</kanban>

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

图表

图表视图用于可视化多个记录或记录组的聚合。它的根元素是 <graph>,它可以接受以下属性:

type (可选)

可以是 bar (default)、pieline,表示要使用的图表类型

stacked (可选)

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

disable_linking (可选)

设置为 1 以防止点击图表时重定向到列表视图

order (可选)

如果设置,x 轴值将默认根据给定顺序(ascdesc)按其度量排序。仅用于 barpie 图表。

string (可选)

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

sample

如果当前模型未找到任何记录,视图是否应填充一组示例记录。

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

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

要求

可选

类型

bool

默认值

False

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

name (必填)

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

invisible (可选)

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

type (可选)

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

interval (可选)

对于日期和日期时间字段,按指定间隔(dayweekmonthquarteryear)分组,而不是按特定的日期时间(固定秒级分辨率)或日期(固定天级分辨率)分组。默认值为 month

string (可选)

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

度量会自动从模型字段生成;仅使用可聚合字段。这些度量还会按字段的字符串进行字母顺序排序。

警告

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

在图表视图中,field 可以具有 widget 属性来指定其格式。小部件应为字段格式化器,其中最常用的是 float_timemonetary

<field name="working_hours_close" widget="float_time"/>

透视表

透视表视图用于将聚合可视化为 透视表。它的根元素是 <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

对于日期和日期时间字段,按指定的时间间隔(dayweekmonthquarteryear)分组,而不是按特定的日期时间(固定秒级分辨率)或日期(固定天级分辨率)分组。

invisible (可选)

如果为 true,则该字段不会出现在活动度量或可选度量中(适用于不适合聚合的字段,例如不同单位的字段,如 € 和 $)。

sample

如果当前模型未找到任何记录,视图是否应填充一组示例记录。

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

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

要求

可选

类型

bool

默认值

False

度量会自动从模型字段生成;仅使用可聚合字段。这些度量还会按字段的字符串进行字母顺序排序。

警告

与图表视图类似,透视表视图在数据库内容上聚合数据,这意味着非存储的函数字段不能用于透视表视图。

在透视表视图中,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>

日历

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

注解

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

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

字符串

字符串(默认值:''

此视图标题仅在打开没有名称且目标为 ‘new’ 的操作时显示(打开对话框时)。

创建

布尔值(默认值:True

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

编辑

布尔值(默认值:True

在视图中禁用/启用记录编辑功能。

删除

布尔值(默认值:True

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

date_start (必填)

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

date_stop

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

date_delay

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

color

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

form_view_id

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

event_open_popup

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

quick_create

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

quick_create_view_id

当设置了属性 quick_create 且用户创建事件时打开的视图,而不是默认对话框。

create_name_field

记录中保存记录文本表示的字段名称,用于通过 ‘快速创建’ 机制创建记录时使用。

all_day

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

mode

加载日历时的默认显示模式。可能的属性包括:dayweekmonthyear

scales

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

createdelete

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

<field>

声明要聚合或用于看板 逻辑 的字段。如果字段只是简单地显示在日历卡片中。

字段可以具有以下附加属性:

invisible

使用 “True” 隐藏卡片中的值。

avatar_field

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

write_modelwrite_fieldfilter_field

您可以添加一个过滤器并将结果保存到定义的模型中,该过滤器会添加到侧边栏中。filter_field 是可选的,允许您指定一个字段来保存过滤器的状态。

filterscolor

使用 “True” 将此字段添加到侧边栏的过滤器中。您可以指定一个 color 字段,用于为复选框着色。

模型通用

Model._date_name = 'date'

用于默认日历视图的字段

活动

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

警告

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

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

string (必填)

标题,应该描述该视图

视图元素的可能子元素包括:

field

声明要在活动 逻辑 中使用的字段。如果字段只是简单地显示在活动视图中,则不需要预先声明。

可能的属性包括:

name (必填)

要获取的字段名称

templates

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

活动视图主要使用标准的 javascript qweb,并提供以下上下文变量(更多详细信息请参见 看板):

widget

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

record

一个对象,所有请求的字段作为其属性。每个字段有两个属性:valueraw_value

队列

Enterprise feature

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

注解

默认情况下,队列视图将使用与操作中定义的相同的列表视图和表单视图。您可以将列表视图和表单视图传递到操作的上下文中,以设置或覆盖将使用的视图(要使用的上下文键为 form_view_idlist_view_id)。

例如,以下是一个非常简单的队列视图:

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

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

string (必填)

标题,应该描述该视图

date_start (必填)

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

date_stop (必填)

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

disable_linking (可选)

设置为 1 以防止点击队列单元格时重定向到列表视图。

mode (可选)

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

timeline (可选)

用于描述时间轴的字符串。它应该是“向后”或“向前”(默认值)。向前时间轴将从 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,则该字段不会出现在活动度量或可选度量中(适用于不适合聚合的字段,例如不同单位的字段,如 € 和 $)。如果值是一个域,则会在当前行记录的上下文中评估该域,如果为 True,则在单元格上设置相应的属性。

widget (可选)

字段显示的替代表示形式。

odoo.addons.base.models.ir_ui_view.sample

如果当前模型未找到任何记录,视图是否应填充一组示例记录。

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

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

要求

可选

类型

bool

默认值

False

网格

Enterprise feature

限制

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

  • 仅对 date 列字段进行了测试,selectionmany2one 虽然名义上已实现并支持,但尚未经过测试,而 datetime 完全未实现。

  • 列单元格几乎不可配置,且必须为数值型。

  • 单元格调整默认禁用,必须进行配置才能启用。

  • 由于 fields_view_get 后处理的限制,createeditdelete 的 ACL 元数据不会自动设置在视图根节点上(有一个固定的显式列表指定哪些视图类型会获取这些属性)。

架构

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

<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 以在网格底部显示一个额外的行,并包含一个“添加一行”按钮(默认值为 false)。当此选项设置为 true 时,控制面板中的“添加一行”按钮将被隐藏。如果没有数据可用且未设置 display_empty (即显示帮助内容时),控制面板中的“添加一行”按钮将显示出来,以便用户创建第一条记录。

    display_empty

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

<button> (0+)

常规的 Odoo 操作按钮,显示在视图头部。

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

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

    注解

    不支持工作流按钮

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

  • 可选的 context

服务器回调会提供视图中显示的所有记录 ID,这些 ID 可能作为方法的参数传递(object 按钮),也可能作为上下文的 active_idsaction 按钮)。

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

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

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

<field type="col"> (1)

列分组字段。

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

name

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

字符串

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

span

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

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

step

表示一列与前一列/后一列之间步长的符号名称。

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

<field type="measure"> (1)

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

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

服务器交互

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

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

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

      values (必填)

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

      domain (必填)

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

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

      values (必填)

      参见行标题值

      domain (必填)

      参见列域值

      current (可选)

      布尔值,标记/高亮显示一列

    • 网格数据作为一个列表(行)的列表(单元格)的单元格字典,每个字典包含以下键:

      value

      与单元格关联的数值

      domain

      与单元格记录匹配的域(应假定为不透明)

      size

      单元格中分组的记录数

      readonly (可选)

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

      classes (可选)

      要添加到单元格容器上的类列表(作为字符串)(位于单元格的 TD 和可能可编辑的元素之间)。

      如果此列表与基础类(前缀为 o_grid_cell_)发生冲突,则忽略此列表中的类。

      请注意,网格数据是 密集的,如果查询数据库未找到与单元格匹配的组,则会生成一个具有必填键默认值的“空”单元格。

    • prevnext 可以是假值(无分页),也可以是要合并到视图自身上下文中以读取前一页或后一页的上下文项,应假定为不透明。

  • read_grid_domain(field, range) (由模块在所有模型上提供)返回与网格当前配置的“跨度”匹配的域。这在 read_grid 内部也会完成,但独立调用可能有用或必要,例如与单独的 search_countread_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_groupread_grid

grouping

列的实际分组字段/查询

domain

如果列字段是分页的,则应用于 read_group 的域,可以是一个空列表。

prevnext

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

values

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

values

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

domain

与此特定列匹配的域

is_current

如果当前列应在网格中特别突出显示,则为 True,否则为 False

format

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

ACL

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

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

上下文键

grid_range

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

grid_anchor

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

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

甘特图

Enterprise feature

甘特图视图适当地显示了甘特图(用于调度)。

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

字符串

字符串(默认值:''

此视图标题仅在打开没有名称且目标为 ‘new’ 的操作时显示(打开对话框时)。

创建

布尔值(默认值:True

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

编辑

布尔值(默认值:True

在视图中禁用/启用记录编辑功能。

删除

布尔值(默认值:True

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

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 表达式

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

{$name} 可以是以下 bootstrap 上下文颜色 之一(dangerinfosecondarysuccesswarning)。

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

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

  • uid:当前用户的 ID,

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

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

<gantt decoration-info="state == 'draft'"
      decoration-danger="state == 'help_needed'"
      decoration-bf="state == 'busy'">
  ...
</gantt>
default_group_by

用于分组任务的字段名称

disable_drag_drop

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

consolidation

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

consolidation_max

字典,以“group by”字段为键,最大汇总值为值,超过该值时单元格将以红色显示(例如,{"user_id": 100}

consolidation_exclude

描述任务是否应排除在汇总之外的字段名称。如果设置为 true,则在汇总行中显示条纹区域

createcell_createeditdeleteplan

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

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

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

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

  • plan:如果启用且 edit 启用,则在时间槽上会显示一个“放大镜”按钮,用于将未分配的记录安排到该时间槽中。

Example

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

offset

根据比例尺,计算默认时间段时需要添加到今天的单位数量。例如:在 default_scale 为周的情况下,偏移量为 +1 将打开下周的甘特图;在 default_scale 为月的情况下,偏移量为 -2 将打开两个月前的甘特图。

progress

提供记录事件完成百分比的字段名称,范围为 0 到 100。

字符串

甘特图视图的标题

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 始终对齐到整天。

精度属性示例:{"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 - 早上 11:00(4 小时)- DST 任务 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>

当按 user_id 分组时,会在用户名旁边显示用户的头像。

odoo.addons.base.models.ir_ui_view.sample

如果当前模型未找到任何记录,视图是否应填充一组示例记录。

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

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

要求

可选

类型

bool

默认值

False

映射

Enterprise feature

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

注解

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

API

该视图使用位置数据平台的 API 来获取瓦片(地图背景)、进行地理编码(将地址转换为坐标集)以及获取路线。视图实现了两个 API:OpenStreetMap 和 MapBox。默认使用 OpenStreetMap,它可以获取 瓦片 并进行 地理编码。此 API 不需要令牌。一旦在通用设置中提供了有效的 MapBox 令牌,视图将切换到 MapBox API。此 API 更快,并允许计算路线。可以通过 注册 MapBox 获取令牌。

结构组件

视图的根元素是 <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

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

limit

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

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

name

要显示的字段。

字符串

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

例如,这里有一个地图:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1">
    <field name="partner_id" string="Customer Name"/>
</map>