视图架构

通用架构

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

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

注解

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

更多内容

视图记录

Python 表达式

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

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

  • 当前记录的 ID;

  • parent:指向容器的记录;仅出现在 关联字段 的子视图中;

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

  • uid (int):当前用户的 id;

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

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

示例

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

示例

<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

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

要求

可选

type

str

默认

''

create

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

要求

可选

type

bool

默认

True

edit

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

要求

可选

type

bool

默认

True

duplicate

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

要求

可选

type

bool

默认

True

delete

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

要求

可选

type

bool

默认

True

js_class

Web 客户端将实例化以替代表单视图的 JavaScript 组件的名称。

要求

可选

type

str

默认

''

disable_autofocus

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

语义组件

语义组件与 Odoo 系统对接,并允许与其交互。

表单视图接受以下子语义组件:字段、标签、按钮、Chatter 小组件 和 附件预览小组件。

占位符以全大写表示。

field:显示字段值

field 元素渲染当前记录的单个字段(在可能的情况下也允许编辑)。

表单视图支持多次使用同一字段,并且这些字段可以为 invisible 和 readonly 属性设置不同的值。这些字段的值可能相同,但显示方式可以不同。但是,当存在多个 required 属性取值不同的字段时,其行为无法保证。

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

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

name

要渲染的字段名称。

要求

必需

type

str

widget

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

要求

可选

type

str

id

节点 id。当视图中多次出现同一字段时很有用(参见 label:显示字段标签)。

要求

可选

type

str

默认

字段名称

string

字段的标签。

要求

可选

type

str

默认

模型字段的 string 属性

help

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

要求

可选

type

str

默认

''

options

字段小组件的配置选项(包括默认小组件),以可求值为 dict 的 Python 表达式给出。

对于关联字段,可使用以下选项:no_create、no_quick_create、no_open 和 no_create_edit。

示例

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

可选

type

Python 表达式

默认

{}

readonly

字段是否可由用户修改(False)或为只读(True),取值为一个求值结果为布尔值的 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

required

字段是否可以留空(False)或必须填写(True),取值为一个求值结果为布尔值的 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

domain

选择已有记录时应用的过滤条件,以可求值为 域 的 Python 表达式给出。

示例

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

可选

type

Python 表达式

默认

[]

范围

关系字段

context

获取可能值以及创建或搜索记录时使用的上下文,以可求值为 dict 的 Python 表达式给出。

示例

<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,
  }"/>
要求

可选

type

Python 表达式

默认

{}

范围

关系字段

nolabel

是否应隐藏字段标签。

要求

可选

type

bool

默认

False

范围

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

placeholder

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

要求

可选

type

str

默认

''

mode

用于该字段关联记录的显示模式(视图类型)列表,以逗号分隔。允许的模式有:list、form、kanban 和 graph。

要求

可选

type

str

默认

list

范围

One2many 和 Many2many 字段

class

要设置在所生成元素上的 HTML 类。

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

  • oe_inline:避免字段后出现通常的换行,并限制其跨度;

  • oe_left、oe_right:将元素 floats (浮动)到相应方向;

  • oe_read_only、oe_edit_only:仅在相应的表单模式下显示该元素;

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

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

示例

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

示例

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

可选

type

str

默认

''

filename

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

要求

可选

type

str

默认

''

范围

Binary 字段

password

该字段是否存储密码,若是则不应显示其数据。

要求

可选

type

bool

默认

False

范围

Char 字段

kanban_view_ref

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

要求

可选

type

str

默认

''

范围

关系字段

default_focus

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

要求

可选

type

bool

默认

False

注解

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

示例

<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 属性。

要求

必需

type

str

string

要显示的标签。

要求

可选

type

str

默认

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

class

要设置在所生成元素上的 HTML 类。

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

  • oe_inline:避免字段后出现通常的换行,并限制其跨度;

  • oe_left、oe_right:将元素 floats (浮动)到相应方向;

  • oe_read_only、oe_edit_only:仅在相应的表单模式下显示该元素;

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

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

示例

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

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

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

示例

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

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

type

str

name

如果 type 为 object,则为要调用的方法。如果 type 为 action,则为要加载的动作的 XMLID,可使用原始格式或 %(XMLID)d 格式。

要求

可选

type

str

默认

''

string

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

示例

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

可选

type

str

默认

''

icon

用于显示按钮的图标。图标清单请参阅 图标。

示例

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

可选

type

str

默认

''

help

鼠标光标悬停时显示的工具提示信息。

示例

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

可选

type

str

默认

''

context

执行按钮调用时合并到视图上下文中的上下文,取值为一个求值结果为字典的 Python 表达式。

示例

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

可选

type

Python 表达式

默认

{}

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

class

要设置在所生成元素上的 HTML 类。

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

  • oe_inline:避免字段后出现通常的换行,并限制其跨度;

  • oe_left、oe_right:将元素 floats (浮动)到相应方向;

  • oe_read_only、oe_edit_only:仅在相应的表单模式下显示该元素;

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

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

示例

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

示例

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

可选

type

str

默认

''

special

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

save

保存记录并关闭对话框。

cancel

关闭对话框而不保存。

示例

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

可选

type

str

默认

''

confirm

执行按钮动作前显示(并让用户接受)的确认消息。

示例

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

可选

type

str

默认

''

data-hotkey

绑定到该按钮的热键(keyboard_shortcut,类似于 accesskey)。当 alt 键与所选字符一起按下时启用;若在值前面加上 shift+,则在按下 shift 键与所选字符时启用。

示例

<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"/>
要求

可选

type

str

默认

''

Chatter 小组件

Chatter 小组件 是沟通与日志工具,可直接从记录(任务、订单、发票、事件、备注……)向同事和客户发送电子邮件。

当模型继承 mail.thread Mixin 时,会通过一个 chatter 元素添加它。

示例

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

附件预览小组件

附件预览小组件通过一个 空 的 div 元素添加,其类为 o_attachment_preview。

示例

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

结构组件

结构组件提供结构或“视觉”特性,几乎不涉及逻辑。它们以元素或元素集的形式用于表单视图。

表单视图接受以下子结构组件:组、工作表、笔记本、笔记本、换行、分隔符、页眉、页脚、按钮容器 和 标题容器。

占位符以全大写表示。

group:定义列布局

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

作为分组的直接子元素的 field 元素默认会显示 label,且标签和字段本身各自的 colspan 均为 1。

子元素按水平方向排布(它们会先尝试填满下一列,然后才换行)。

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

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

string

为该分组显示的标题。

要求

可选

type

str

默认

''

col

group 中的列数。

要求

可选

type

int

默认

2

colspan

子元素占用的列数。

要求

可选

type

int

默认

1

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

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 根元素的直接子元素,以获得更窄、更具响应性的表单布局(页面居中、边距……)。它通常包含 group 元素。

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

notebook 与 page:添加选项卡区域

notebook 元素定义一个选项卡区域。每个选项卡通过一个 page 子元素定义。

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

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

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

string

选项卡的标题。

要求

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

其渲染效果的可能结构与表示形式

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

newline:开始新的分组行

newline 元素用于 group 元素内部,提前结束当前行并立即切换到新行,而不会先填满任何剩余的列。

<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

作为节标题显示的标题。

要求

可选

type

str

默认

''

其渲染效果的可能结构与表示形式

../../../_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 本身之上提供一个全宽的区域,通常用于显示工作流 button 元素以及一个渲染为状态小组件的 field 元素。

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

示例

<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 元素创建 button 元素的容器。

<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 元素创建标题 field 元素的容器。

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

平台设置

设置视图是 form 视图的一种定制。它们用于在集中的位置显示设置。它们与通用表单视图的区别在于具有搜索栏和侧边栏。

示例

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

组件

设置视图接受 form 视图的 field、label 和 button 元素,以及三个额外的子元素:app、block 和 setting。

占位符以全大写表示。

app:声明应用

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

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

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

string

应用的名称。

要求

必需

type

str

name

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

要求

必需

type

str

logo

徽标的 relative path。

要求

可选

type

path

默认

使用 name 属性计算出的路径:/name/static/description/icon.png

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

block:声明一组设置

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

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

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

title

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

要求

可选

type

str

默认

''

help

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

要求

可选

type

str

默认

''

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

setting:声明设置

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

设置中的第一个 field 元素用作主字段。如果它是布尔字段,则放在左侧面板,否则放在右侧面板的顶部。如果未定义 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

默认情况下,设置会在视觉上分为两个面板(左侧和右侧),用于编辑指定的 field。通过定义 type="header",则会改为渲染一种特殊类型的设置。该设置用于修改其他设置的作用范围。例如,在网站应用中,该设置用于指明其他设置应用于哪个网站。header 设置以屏幕顶部的横幅形式呈现。

要求

可选

type

str

默认

''

string

用作设置标签的文本。

要求

可选

type

str

默认

第一个字段的标签

title

用作工具提示的文本。

要求

可选

type

str

默认

''

help

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

要求

可选

type

str

默认

''

company_dependent

设置是否特定于公司。若设置,图标会显示在设置标签旁边。

它只接受值 '1'。

要求

可选

type

str

默认

''

documentation

指向该设置的文档的 path。若设置,可点击的图标会显示在设置标签旁边。该路径既可以是绝对路径,也可以是 relative path。在后一种情况下,它相对于 https://www.odoo.com/documentation/<version>。

要求

可选

type

path_

默认

''

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

列表

列表视图的根元素是 list,之前的名称是 tree。

其渲染效果的可能结构与表示形式

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

根属性

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

string

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

要求

可选

type

str

默认

''

create

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

要求

可选

type

bool

默认

True

edit

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

要求

可选

type

bool

默认

True

delete

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

要求

可选

type

bool

默认

True

import

在视图上禁用/启用从数据导入记录。

要求

可选

type

bool

默认

True

export_xlsx

在视图上禁用/启用将记录导出为数据。

要求

可选

type

bool

默认

True

editable

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

top

新记录从列表顶部创建。

bottom

新记录从列表底部创建。

内联 form 视图的结构派生自列表视图。因此,表单视图的字段和按钮上有效的大多数属性也会被列表视图接受,不过如果列表视图不可编辑,它们可能没有任何意义。

重要

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

要求

可选

type

str

默认

''

multi_edit

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

它只接受值 '1'。

要求

可选

type

str

默认

''

open_form_view

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

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

要求

可选

type

bool

默认

False

default_group_by

默认用于对记录进行分组的字段名(当未通过动作或当前 搜索 指定分组时)。

要求

可选

type

str

默认

''

default_order

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

要反转某个字段的排序方向,请在其后加上 desc,并以空格分隔。

示例

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

可选

type

str

默认

''

decoration-<style>

应应用于匹配记录行的样式,以计算结果为布尔值的 Python 表达式给出。

<style> 必须替换为以下之一:bf 表示粗体、it 表示斜体、info、warning、danger、muted、primary 和 success。

示例

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

可选

type

Python 表达式

默认

False

limit

页面的默认大小。它必须严格大于零。

要求

可选

type

int

默认

80 用于列表视图,40 用于表单视图中的 X2many 列表

groups_limit

列表视图分组时每页的默认分组数量。它必须严格大于零。

要求

可选

type

int

默认

80 用于列表视图,40 用于表单视图中的 X2many 列表

expand

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

警告

根据分组数量的不同,速度可能会很慢。

要求

可选

type

bool

默认

False

sample

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

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

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

组件

列表视图接受以下子元素:field、button、groupby、header 以及 control 和 create。

占位符以全大写表示。

field:显示字段值

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

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

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

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

name

要渲染的字段名称。

要求

必需

type

str

widget

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

要求

可选

type

str

string

字段的标签。

要求

可选

type

str

默认

模型字段的 string 属性

optional

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

它可以具有两个不同的值:

show

该字段默认显示。

hide

该字段默认隐藏。

示例

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

可选

type

str

readonly

字段是否可由用户修改(False)或为只读(True),取值为一个求值结果为布尔值的 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

required

字段是否可以留空(False)或必须填写(True),取值为一个求值结果为布尔值的 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

column_invisible

列是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

与 invisible 不同,它作用于整列,并且在计算时不考虑子树的值。

示例

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

可选

type

Python 表达式

默认

False

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

decoration-<style>

应应用于匹配记录字段的样式,以计算结果为布尔值的 Python 表达式给出。

<style> 必须替换为以下之一:bf 表示粗体、it 表示斜体、info、warning、danger、muted、primary 和 success。

示例

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

可选

type

Python 表达式

默认

False

sum, avg

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

示例

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

可选

type

str

默认

''

width

列表视图总是尝试优化各列之间的可用空间。对于某些字段类型,这会根据字段类型强制设定宽度来实现。例如,我们确切知道显示日期所需的像素数,因此可以确保日期字段的列不会占用超过严格必需的空间,从而将多余的空间留给其他列。然而,框架无法猜测每种字段类型的合适宽度。例如,char 字段既可以用于编码较大的值,也可以用于编码 3 个字母的国家代码。

width 属性可用于指定给定列的理想宽度。它允许指定固定宽度(例如 width="40px")、最小宽度(例如 width="[40px]")或最小与最大宽度(例如 width="[40px,70px]")。这些宽度表示渲染单元格内各值所需的空间。列的实际宽度则为给定值加上单元格左右内边距之和。

注意:这些宽度始终以像素为单位,因此可以省略 “px” 后缀(例如 width="30")。

要求

可选

type

str

默认

''

nolabel

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

它只接受值 '1'

要求

可选

type

str

默认

''

注解

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

column:将多个字段组合到堆叠单元格中

<list>
    <column string="LABEL">
        <field name="FIELD_NAME_1"/>
        <field name="FIELD_NAME_2"/>
    </column>
</list>

column 元素将多个字段组合到单个表格单元格中,以堆叠行的形式显示它们。

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

string

列标题中显示的标签。省略时,改用第一个堆叠字段的标签。

要求

可选

type

str

width

列的理想宽度。省略时,宽度由第一个子字段推断得出。有关可接受的语法,请参阅 field 元素的 width attribute。

要求

可选

type

str

column_invisible

列是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

与 invisible 不同,它作用于整列,并且在计算时不考虑子树的值。

示例

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

可选

type

Python 表达式

默认

False

每个子 <field> 元素都支持与常规 list field 相同的属性。请注意,column_invisible 对子字段没有效果;请改为在 column 元素上使用它来隐藏整个堆叠列。

其渲染效果的可能结构与表示形式

../../../_images/list_column.svg
<list>
    <field name="name"/>
    <column string="Contact">
        <field name="partner_id"/>
        <field name="email"/>
    </column>
</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)。

示例

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

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

type

str

name

如果 type 为 object,则为要调用的方法。如果 type 为 action,则为要加载的动作的 XMLID,可使用原始格式或 %(XMLID)d 格式。

要求

可选

type

str

默认

''

string

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

示例

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

可选

type

str

默认

''

icon

用于显示按钮的图标。图标清单请参阅 图标。

示例

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

可选

type

str

默认

''

help

鼠标光标悬停时显示的工具提示信息。

示例

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

可选

type

str

默认

''

context

执行按钮调用时合并到视图上下文中的上下文,取值为一个求值结果为字典的 Python 表达式。

示例

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

可选

type

Python 表达式

默认

{}

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

column_invisible

列是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

与 invisible 不同,它作用于整列,并且在计算时不考虑子树的值。

示例

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

可选

type

Python 表达式

默认

False

class

要设置在所生成元素上的 HTML 类。

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

  • oe_inline:避免字段后出现通常的换行,并限制其跨度;

  • oe_left、oe_right:将元素 floats (浮动)到相应方向;

  • oe_read_only、oe_edit_only:仅在相应的表单模式下显示该元素;

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

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

示例

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

示例

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

可选

type

str

默认

''

其渲染效果的可能结构与表示形式

../../../_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:定义分组标题

在按 Many2one 字段对记录分组时,groupby 元素用于使用 button 元素定义分组标题。它也接受 field 元素,可用于修饰符。因此,这些字段属于 Many2one 的共模型。这些额外字段是批量获取的。

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

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

name

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

可以定义一个带有 type="edit" 的特殊 button 元素,用于打开 Many2one 字段的表单视图。

要求

必需

type

str

其渲染效果的可能结构与表示形式

../../../_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"/>
        <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 元素允许在控制面板中定义按钮。它与 列表视图中的 button 元素 是同一个元素,但当它放在 header 元素内部时还接受一个额外的属性:

display

使按钮随时可用,无需选择记录。

它只接受值 always。

示例

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

可选

type

str

默认

''

其渲染效果的可能结构与表示形式

../../../_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>

control:自定义创建和删除动作

control 元素允许自定义创建和删除动作。特别是,它允许添加带特定上下文的特殊创建按钮、将常规视图按钮用作创建动作,以及仅在特定条件下提供创建和删除动作。

重要

control 元素仅在 One2many 或 Many2many 字段内部的列表视图中受支持。

<list>
   <control>
       <create string="LABEL"/>
       <BUTTONS/>
       <delete invisible="parent.is_sent">
    </control>
    ...
</list>

control 元素不接受任何属性。它接受以下子元素:

create

给定的 create 元素会替换默认的 添加一行 按钮。create 元素可以具有以下属性:

string

按钮的文本。

要求

必需

type

str

context

执行按钮调用时合并到视图上下文中的上下文,取值为一个求值结果为字典的 Python 表达式。

要求

可选

type

Python 表达式

默认

{}

invisible

元素是可见的(False)还是隐藏的(True),以计算结果为布尔值的 Python 表达式表示。在表达式中可以使用父记录和上下文。

要求

可选

type

Python 表达式

默认

False

button

与 常规视图按钮 相同

delete

delete 元素允许逐行有条件地隐藏删除图标。该类型只能有一个子元素。它只能有一个属性:

invisible

与 create 相同,区别在于此处表达式中还可以使用记录本身。

其渲染效果的可能结构与表示形式

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

组件

搜索视图接受以下子元素: field、filter、separator、group 和 searchpanel。

占位符以全大写表示。

field:基于字段值筛选

field 元素使用用户提供的值来定义域或上下文。生成搜索域时,各字段域之间以及字段域与筛选器之间使用 AND 运算符连接。

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

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

name

用于筛选的字段名称。

要求

必需

type

str

string

字段的标签。

要求

可选

type

str

默认

模型字段的 string 属性

operator

默认情况下,字段生成的域形式为 [(name, operator, value)],其中 name 是字段名称,value 是用户提供的值,该值可能经过筛选或转换(例如,用户应提供选择字段值的 label,而不是值本身)。

operator 属性可用于覆盖默认运算符,默认运算符取决于字段类型(例如,浮点型字段为 =,而字符型字段为 ilike,many2one 字段为 child_of)。

要求

可选

type

str

默认

=

filter_domain

用作字段搜索域的域,以 Python 表达式给出,该表达式的求值结果为一个 域。

它可以使用 self 变量将用户提供的值注入自定义域中。与仅使用 operator 属性相比,它可以生成灵活得多的域(例如,一次搜索多个字段)。

如果同时提供了 operator 和 filter_domain 属性,则以 filter_domain 为准。

要求

可选

type

Python 表达式

默认

[]

context

要合并到搜索视图所针对的视图上下文中的上下文,以 Python 表达式给出,该表达式的求值结果为一个 dict。

它可以包含用户提供的值,这些值可通过 self 变量获取。

要求

可选

type

Python 表达式

默认

{}

domain

要应用于支持自动补全的字段(例如 Many2one)的补全结果的筛选条件。

要求

可选

type

Python 表达式

默认

[]

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

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

筛选器的技术名称。它可用于 默认启用筛选器,或用作 继承钩子。

要求

必需

type

str

string

筛选器的标签。

要求

必需

type

str

help

鼠标悬停在筛选器上时显示的工具提示。

要求

可选

type

str

默认

''

domain

作为搜索域的一部分追加到动作的域中的域。

要求

可选

type

Python 表达式

默认

[]

date

用于筛选的 date 或 datetime 字段的名称。

使用此属性时,会创建一组可在 筛选 菜单的子菜单中使用的筛选器。可用的筛选器与时间相关,但在其域于实例化控制面板时求值这一意义上并非动态的。

示例

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

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

示例

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

请注意,以这种方式定义的所有自定义筛选器彼此之间互斥,与其他子筛选器也互斥。

要求

可选

type

str

默认

''

end_date

用于表示记录所描述期间结束的 date 或 datetime 字段的名称,以便按日期范围而不是单个日期进行筛选。

此时,筛选器会匹配其范围与所搜索期间重叠的记录,即域 ['&', (date, '<=', period_end), '|', (end_date, '>=', period_start), '&', (end_date, '=', False), (date, '>=', period_start)]。没有结束日期的记录在其开始时即结束。

由于该筛选器涉及两个字段,因此应设置 string 属性:否则会回退为 date 属性中字段的标签。

示例

<filter string="Period" name="filter_period" date="date_start" end_date="date_stop"/>
要求

可选

type

str

默认

''

范围

date 属性非空的筛选器

default_period

基于时间的筛选器(带有 date 属性)的默认期间。它必须是某个有效筛选器 id,或由逗号分隔的有效筛选器 id 列表。

有效筛选器 id 包括以下内容:

  • first_quarter、second_quarter、third_quarter 和 fourth_quarter。

  • month、month-1 和 month-2 之一。

  • year、year-1 和 year-2 之一。

  • 可导航的相对期间 today、this_week、this_month、this_quarter 和 this_year 之一。

  • 筛选器内定义的任何自定义筛选器的 name,前面加上 custom_。

该筛选器必须属于视图初始化时激活的默认筛选器集合。

示例

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

示例

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

可选

type

str

默认

month

范围

date 属性非空的筛选器

invisible

元素是可见(False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。

注解

invisible 属性有两种用途:

  • 易用性:根据内容避免视图过于拥挤,并让用户更易阅读。

  • 技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。

示例

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

可选

type

Python 表达式

默认

False

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

context

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

将上下文键 group_by 的值设置为某个字段,可以定义一个在 分组依据 菜单中可用的分组。当字段类型为 date 或 datetime 时,该筛选器会在 分组依据 菜单中生成一个子菜单,其中提供以下时间间隔选项: 年、季度、月、周 和 日。

示例

<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'}"/>

注解

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

要求

可选

type

Python 表达式

默认

{}

小心

连续的筛选器(其间没有非筛选器元素分隔)会被视为按包含方式组合:它们将使用 OR 而不是通常的 AND 进行组合。

示例

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

显示 state 字段为 draft 或 done 的记录。

示例

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

state 字段为 draft 且 delay 字段小于 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>
延迟加载的筛选器选项

filter 元素可以内嵌一个 <field> 子元素,从而创建一个筛选器,其选项在用户展开时动态加载。此时该筛选器会在 筛选 菜单中渲染为可展开项,其选项在首次点击时获取,而不是在视图初始化时获取。

<search>
    <filter string="LABEL" name="NAME">
        <field name="FIELD_NAME"/>
    </filter>
</search>

<field> 子元素仅支持 Selection、Many2one 和 Many2many 字段。对于关系字段,如果初始集合之外还有其他记录可用,会出现 更多… 按钮,允许用户逐步加载更多选项。

<field> 子元素接受以下属性:

domain

用于筛选作为选项获取的记录的域。这仅适用于 Many2one 和 Many2many 字段,对 Selection 字段没有影响。

要求

可选

type

Python 表达式

默认

[]

范围

<filter> 的 <field> 子元素

选择某个选项后,生成的搜索域是 <filter> 元素的 domain 属性与所选选项的域的组合。

示例

<search>
    <!-- Shows all Priority values; selecting one filters to leads only -->
    <filter string="Lead Priority" name="lead_priority" domain="[('type', '=', 'lead')]">
        <field name="priority"/>
    </filter>
    <!-- Shows only teams where the current user is team leader (field domain) -->
    <!-- Selecting one also filters by assignee with the current user (filter domain)-->
    <filter string="My Sales Teams" name="sales_teams_switcher" domain="[('user_id', '=', uid)]">
        <field name="team_id" domain="[('user_id', '=', uid)]"/>
    </filter>
</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

用于筛选的字段名称。

要求

必需

type

str

string

字段的标签。

要求

可选

type

str

默认

模型字段的 string 属性

select

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

one

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

multi

可以选择多个值。支持的字段类型为 many2one、many2many 和 selection。

要求

可选

type

str

默认

one

groups

元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符 ! 前缀,以便将其排除。

示例

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

可选

type

str

默认

''

icon

字段的图标。

要求

可选

type

str

默认

''

color

字段的颜色。

要求

可选

type

str

默认

''

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

hierarchize

子类别应显示在其父类别之下,还是显示在同一层级。

要求

可选

type

bool

默认

True

范围

Many2one 字段

depth

如果设置为非零整数,则层级结构(如果有)将展开到指定层级。

要求

可选

type

整数

默认

0

范围

Many2one 字段

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

enable_counters

是否计算记录计数器,并在其非零时显示。

小技巧

提供此属性是为了避免影响性能。解决性能问题的另一种方法是重写 search_panel_select_range 和 search_panel_select_multi_range 方法。

要求

可选

type

bool

默认

False

expand

是否显示没有记录的类别和筛选器。

要求

可选

type

bool

默认

False

limit

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

要求

可选

type

int

默认

200

domain

记录必须满足的条件。

示例

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

可选

type

Python 表达式

默认

[]

groupby

值应基于其进行分组的字段名称。

要求

可选

type

str

默认

''

范围

Many2one 和 Many2many 字段

搜索默认值

搜索字段和筛选器可以通过动作的 context 使用 search_default_name 键进行配置。对于字段,值必须是要设置给该字段的值。对于筛选器,值必须是布尔值或数字。

示例

假设 foo 是一个字段、bar 是一个筛选器,以下动作上下文会在 foo 上搜索 acro,并默认启用 bar:

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

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

示例

假设 foo 和 bar 是两个 groupby 筛选器,以下动作上下文会先启用 bar,再启用 foo。

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

注解

延迟加载的筛选器(带有 <field> 子元素的筛选器)不能用作搜索默认值,因为它们的选项仅在用户展开时才会获取。

看板

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

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

看板视图的根元素是 kanban。

其渲染效果的可能结构与表示形式

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

注解

看板视图最多加载并显示十列。此后的任何列都会处于关闭状态,但用户仍可将其打开。

根属性

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

string

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

要求

可选

type

str

默认

''

create

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

要求

可选

type

bool

默认

True

edit

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

要求

可选

type

bool

默认

True

delete

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

要求

可选

type

bool

默认

True

default_group_by

默认用于对记录进行分组的字段名(当未通过动作或当前 搜索 指定分组时)。

要求

可选

type

str

默认

''

default_order

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

要反转某个字段的排序方向,请在其后加上 desc,并以空格分隔。

示例

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

可选

type

str

默认

''

class

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

要求

可选

type

str

默认

''

examples

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

要求

可选

type

str

默认

''

group_create

是否显示 添加新列 栏。

要求

可选

type

bool

默认

True

group_delete

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

要求

可选

type

bool

默认

True

group_edit

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

要求

可选

type

bool

默认

True

groups_draggable

是否可以重新排列列的顺序。

要求

可选

type

bool

默认

True

records_draggable

看板视图分组时是否可以拖动记录。要使用特定字段作为顺序、通过拖放来重新排列记录,请在卡片模板中对该字段使用 handle 小部件。

要求

可选

type

bool

默认

True

archivable

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

要求

可选

type

bool

默认

True

quick_create

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

要求

可选

type

bool

默认

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

quick_create_view

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

要求

可选

type

str

默认

''

on_create

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

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

要求

可选

type

str

默认

''

can_open

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

要求

可选

type

bool

默认

True

highlight_color

用于为看板卡片左侧边框着色的整型字段的名称。与卡片模板中某字段上的 kanban_color_picker 小部件结合使用,用户可以直接从卡片上编辑颜色。

要求

可选

type

str

card_id

其模板用于渲染看板卡片的 卡片视图 的 ID。设置后,就不再需要看板视图自身的 templates 元素。这样可以在多个视图之间共享同一个卡片定义。

示例

<record id="my_model_card" model="ir.ui.view">
    <field name="name">my.model.card</field>
    <field name="model">my.model</field>
    <field name="arch" type="xml">
        <card>
            <templates>
                <t t-name="card">
                    <field name="name"/>
                </t>
            </templates>
        </card>
    </field>
</record>

<record id="my_model_kanban" model="ir.ui.view">
    <field name="name">my.model.kanban</field>
    <field name="model">my.model</field>
    <field name="arch" type="xml">
        <kanban card_id="%(my_module.my_model_card)d"/>
    </field>
</record>
要求

可选

type

int(视图 id)

默认

''

sample

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

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

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

组件

看板视图接受以下子元素: templates、field、header 和 progressbar。

templates:定义卡片结构

templates 元素用于定义构建看板卡片结构的 QWeb 模板。或者,可以通过 card_id 根属性引用外部的 卡片视图,从而在多个视图之间共享同一个卡片视图定义。

使用内联模板时,必须至少定义一个根 card 模板。还可以定义一个 menu 模板,它将渲染为可通过卡片上的 按钮访问的下拉菜单。

示例

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

有关模板结构、渲染上下文、可用变量、按钮、小部件和布局的完整文档,请参阅 卡片视图。

除了所有基于卡片的视图都支持的 action 和 object 按钮类型之外,看板模板还支持 button 和 a 元素上的以下 type 值:

open

点击该元素会在表单视图中打开卡片的记录。

delete

点击该元素会删除卡片的记录并移除该卡片。

archive

点击该元素会归档卡片的记录并移除该卡片。

unarchive

点击该元素会取消归档卡片的记录并移除该卡片。

set_cover

点击该元素可选择一张图片,将其设为该记录的封面图片。

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

field 元素也可以在 t-name 模板 之外 使用,但仍须位于 templates 元素内部。在这种情况下,它声明的是不在卡片中显示、但仍需获取的字段,例如因为这些字段的值被用于 t-if 条件。

示例

<kanban>
   <field name="is_company"/>
   <templates>
      <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 显示模式可用,因为目前还无法在看板视图中选择记录。

示例

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

可选

type

str

默认

display

progressbar:在列顶部显示进度条

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

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

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

field

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

要求

必需

type

str

colors

进度条字段值到颜色值 muted、success、warning 和 danger 的映射。

要求

必需

type

JSON

sum_field

用于在进度条旁显示的合计中所使用的字段名称。如果未设置,则改为显示记录总数。

要求

可选

type

str

默认

''

其渲染效果的可能结构与表示形式

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

control:自定义创建和删除动作

与 列表视图 相同。

银行卡

卡片视图定义用于将单条记录渲染为卡片的结构。它们是独立的视图记录,可通过 card_id 属性被 看板 和其他视图引用,从而使同一卡片模板能够在多种场景中复用(例如看板面板、甘特图弹出窗口或日历事件)。

卡片视图的根元素是 card。

<card>
   <templates>
      <t t-name="card">
         ...
      </t>
   </templates>
</card>

根属性

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

create

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

要求

可选

type

bool

默认

True

edit

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

要求

可选

type

bool

默认

True

delete

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

要求

可选

type

bool

默认

True

组件

卡片视图接受以下子元素:templates、field。

templates:定义卡片结构

templates 元素用于定义构成卡片结构的 QWeb 模板。

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

这些模板使用 JavaScript QWeb 编写。

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

警告

这些是 QWeb 模板,而不是 Owl 模板,这意味着诸如 t-on-click 之类的指令不可用。

字段

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

name

要渲染的字段名称。

要求

必需

type

str

widget

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

要求

可选

type

str

默认情况下,字段节点会被替换为包含其格式化值的 span,除非指定了 widget 属性,此时它们的渲染方式和行为取决于对应的小组件。

请参阅 字段章节,了解各种小组件及其选项。

渲染上下文

由于卡片模板使用 QWeb 引擎 渲染,它们具有 渲染上下文,即在模板中可用的一组变量,包含有用的信息和工具。以下是可用的变量:

record

一个包含视图中定义的所有字段的对象。每个字段有两个属性:value 和 raw_value。前者按当前用户参数进行格式化,后者是原始值(例如 many2one 字段的 id)。例如,该对象可用于在 t-if 条件中使用字段值。若用于显示,我们建议使用 <field> 标签。

示例

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

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

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

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

这对于有条件地显示需要特定访问权限的元素很有用。

示例

<card>
   <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>
</card>
context

当前上下文,它来自打开该视图的动作,或来自在表单视图中嵌入该视图的 one2many 或 many2many 字段。

read_only_mode

指示该视图为只读。

type

bool

selection_mode

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

type

bool

luxon

luxon 对象,可用于操纵日期和日期时间字段值。

JSON

JavaScript 的 JSON 命名空间对象,其中包含 parse 方法,可用于将 json 字段值解析为 JavaScript 对象。

部件

widget 元素允许在卡片中插入动态生成的(在 JavaScript 中)HTML。它有一个必需的 name 属性,指向注册到 view_widgets 注册表中的 JavaScript 实现(一个 Owl 组件)。

请参阅 小组件章节,了解各种小组件及其选项。

布局

使用标准 HTML 元素和 Bootstrap 实用类 可以轻松实现多种卡片布局。默认情况下,卡片是一个 flexbox 容器,方向为 column。

示例

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

footer HTML 元素的样式设置为固定在卡片底部,并且是一个方向为 row 的 flexbox 容器,便于在同一行中显示多个字段。

示例

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

要在卡片侧面显示某些内容(例如图片),可以使用 aside 和 main HTML 元素,并在卡片上使用 flex-row 类名。main 节点是一个 flexbox 容器,与没有 aside 时的卡片相同。

示例

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

小技巧

在 aside 元素上设置类名 o_card_aside_full 可以移除内边距,使图片延伸到卡片边缘。

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

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

示例

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

QWeb

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

QWeb 视图有两种使用场景:

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

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

与基本的 qweb-as-template 相比,qweb-as-view 的主要新增内容有:

  • 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 (默认)、pie 和 line 之一,即要使用的图表类型

stacked (可选)

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

disable_linking (可选)

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

order (可选)

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

string (可选)

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

sample

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

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

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

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

name (必填)

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

invisible (可选)

如果为 true,该字段既不会出现在可用度量中,也不会出现在可选择的度量中。

type (可选)

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

interval (可选)

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

string (可选)

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

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

警告

图表视图的聚合在数据库内容上执行,因此非存储的函数字段无法用于图表视图

在图表视图中,field 可以具有 widget 属性以指定其格式。该小组件应为字段格式化器,其中最有用的有 float_time 和 monetary。

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

透视表

数据透视视图用于以 pivot table 的形式可视化聚合结果。其根元素是 <pivot>,可以接受以下属性:

disable_linking (可选)

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

display_quantity (可选)

设为 1 可默认显示“数量”列。

default_order (可选)

度量名称以及顺序(asc 或 desc),用作视图中的默认排序。

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

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

name (必填)

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

string (可选)

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

type (可选)

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

row (默认)

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

col

创建按列分组

measure

要在组内聚合的字段

interval

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

invisible (可选)

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

sample

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

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

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

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

警告

与图表视图一样,数据透视视图在数据库内容上聚合数据,这意味着非存储的函数字段无法用于数据透视视图

在数据透视视图中,field 可以具有 widget 属性以指定其格式。该小组件应为字段格式化器,其中最有用的有 date、datetime、float_time 和 monetary。

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

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

日历

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

注解

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

其根元素是 <calendar>。根节点上可用的属性有:

date_start

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

要求

必需

type

str

date_stop

记录中用于保存事件结束日期的字段名称。

要求

可选

type

str

默认

date_start

scales

可用刻度的逗号分隔列表,可选值为 day、week、month、year。默认情况下所有刻度均可用。

要求

可选

type

str

默认

"day,week,month,year"

mode

日历的默认刻度。

要求

可选

type

"day", "week", "month" or "year"

默认

"week"

color

用于 颜色分段 的记录字段名称。同一颜色分段中的记录在日历中会分配相同的高亮颜色。

要求

可选

type

str

all_day

记录中布尔字段的名称,该字段指示对应事件是否被标记为全天事件,此时持续时间无关紧要。

要求

可选

type

str

aggregate

用于在筛选侧面板中于筛选器旁显示聚合值的记录字段名称。聚合器可以显式指定(例如 aggregate="expected_revenue:sum")。如果未指定,则使用该字段的聚合器。支持的聚合器有 sum、avg、min、max、count 和 count_distinct。

要求

可选

type

str

event_limit

限制日历单元格中显示的事件数量(在 month 刻度下),以及 week 和 day 刻度下全天事件的数量。如果事件数超过该限制,则会添加一个“更多”按钮,在弹出框中显示其余事件。

要求

可选

type

int

默认

5

show_unusual_days

若设为 true,周末和公共假日的背景将显示为灰色。

要求

可选

type

bool

默认

False

hide_date

设为 true 可隐藏记录弹出框中的日期部分。

要求

可选

type

bool

默认

False

hide_time

设为 true 可隐藏记录弹出框中的时间部分。

要求

可选

type

bool

默认

False

month_overflow

默认情况下,在月模式下会显示上个月的最后几天和下个月的最初几天及其事件。此选项可禁用该行为,使这些相邻日期显示为灰色且不显示其事件。

要求

可选

type

bool

默认

True

show_date_picker

默认情况下,侧面板中会在主日历旁显示一个小日历(月模式)。此选项允许通过将其设为 False 来移除它。

要求

可选

type

bool

默认

True

schedule

若设为 True,未排期的事件(未设置开始日期和停止日期的事件)将显示在侧面板中,以便用户将这些事件拖放到日历中立即为其排期。

要求

可选

type

bool

默认

False

event_open_popup

若为 true,则在对话框中打开事件以进行编辑;否则在经典表单视图中打开。

要求

可选

type

bool

默认

False

form_view_id

用户创建或编辑事件时要打开的视图。默认使用当前动作的表单视图(如果有)。

要求

可选

type

int

quick_create

启用点击时的快速事件创建:仅要求用户提供 name,并尝试仅使用该名称和点击的事件时间创建新事件。如果快速创建失败,则回退到完整的表单视图。

要求

可选

type

bool

默认

True

create_name_field

记录中保存其显示名称的字段名称。通过“快速创建”机制创建记录时会使用该字段。

要求

可选

type

str

默认

name

quick_create_view_id

当设置了 quick_create 属性且用户创建事件时要打开的表单视图 Id,用于替代仅允许指定名称的默认对话框。

要求

可选

type

int

multi_create_view

表单视图的引用。设置后,在 month 刻度下,可通过点击日历单元格或选择一片日历单元格区域来批量创建(和删除)记录。此时会为每个选中的单元格和每个生效的筛选值创建一条记录,其值取自侧面板中显示的多重创建表单视图。在删除模式下,所选单元格中显示的所有记录都会被删除。

注意:如果侧面板包含多个筛选部分,则只使用第一个,以避免组合爆炸。

要求

可选

type

str

create

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

要求

可选

type

bool

默认

True

edit

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

要求

可选

type

bool

默认

True

delete

禁用/启用视图中的记录删除。

要求

可选

type

bool

默认

True

string

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

要求

可选

type

str

默认

''

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

组件

日历视图接受两类子元素:<field> 和 弹出框。

点击记录(日历事件)时会打开一个弹出框以显示其部分字段。当视图未定义 弹出框 元素时,这些字段就是直接声明在 <calendar> 根元素下的 <field> 元素;它们会按给定顺序显示在弹出框中。

注解

默认情况下,弹出框中的字段为只读,除非对应记录可编辑(参见 edit 根属性),此时可直接在弹出框中编辑。如果 edit 动作可用,弹出框中还会显示一个 编辑 按钮,用于打开可编辑字段的表单视图。

字段节点可以具有以下属性:

name

要渲染的字段名称。

要求

必需

type

str

widget

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

要求

可选

type

str

invisible

Python 表达式,指示该字段是否应显示。表达式中可以使用模型的其他字段,只要这些字段也在此处声明。

要求

可选

type

Python 表达式

默认

False

options

Python 表达式,编码该字段的选项对象。特别是 icon 选项,它允许以类名形式指定在弹出框中字段前显示哪个图标(例如 fa fa-users)。如果未指定图标,则可设置 string 选项,其值将作为标签显示在字段前。

要求

可选

type

Python 表达式

默认

{}

在日历架构中指定 <field> 还可通过设置 filters 属性来自定义筛选侧面板。此时还可以使用以下额外属性:

filters

若设为 true,该字段可从日历的侧面板中用作筛选条件。

要求

可选

type

bool

默认

False

avatar_field

仅适用于关系字段。指定关联模型上字段的名称,该字段用于在侧面板筛选中作为头像显示在字段值前面。

要求

可选

type

str

color

指定使用哪个字段为侧面板筛选中的复选框着色。默认情况下,使用日历视图的 color 属性将事件与筛选中的值进行匹配。

要求

可选

type

str

write_model

允许即时创建新的筛选值。给定的模型将用作这些筛选的模型。可与 write_field 组合使用。

要求

可选

type

str

write_field

与 write_model 组合使用,指定给定模型中用于编码筛选值的字段名称。

要求

可选

type

str

filter_field

与 write_model 组合使用,指定给定模型中用于编码筛选状态(是否被勾选)的字段名称。

要求

可选

type

str

popover:自定义记录的弹出框

要完全控制弹出框的结构,可以将单个 <popover> 元素添加为 <calendar> 根元素的直接子元素,而不依赖上述自动生成的弹出框。有关 <popover> 元素的完整结构及其 card_id 属性,请参阅 弹出框。

示例

<calendar date_start="start" date_stop="stop">
    <popover>
        <templates>
            <t t-name="popover-header">
                <field name="name"/>
            </t>
            <t t-name="popover-body">
                <field name="partner_id"/>
            </t>
            <t t-name="popover-footer">
                <button class="btn btn-secondary" type="object" name="my_method" string="Do something"/>
            </t>
        </templates>
    </popover>
</calendar>

活动

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

警告

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

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

string (必填)

标题,应描述该视图

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

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

field

声明用于活动 逻辑 的字段。如果该字段仅在活动视图中显示,则无需预先声明。

可能的属性包括:

name (必填)

要获取的字段名称

templates

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

活动视图使用基本标准的 javascript qweb,并提供以下上下文变量(更多细节请参阅 看板):

widget

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

record

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

队列

Enterprise feature

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

注解

默认情况下,同期群视图将使用动作上定义的相同列表视图和表单视图。您可以将列表视图和表单视图传入动作的上下文,以设置/覆盖将要使用的视图(要使用的上下文键为 form_view_id 和 list_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 (可选)

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

interval (可选)

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

measure (可选)

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

<field> (可选)

允许指定一个特定字段以便从可用度量中管理它,其主要用途是从可选度量中隐藏某个字段:

name (必填)

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

string (可选)

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

invisible (可选)

若为 true,该字段既不会出现在活动度量中,也不会出现在可选度量中(适用于聚合后没有意义的字段,例如单位不同的字段,如 € 和 $)。如果该值为域,则该域会在当前行记录的上下文中求值;若为 True,则会在单元格上设置对应属性。

widget (可选)

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

sample

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

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

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

网格

Enterprise feature

限制

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

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

  • 列单元格几乎没有可配置性,且必须为数值

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

  • create、edit 和 delete ACL 元数据不会自动设置到视图根元素上,这是受 fields_view_get 后处理的限制(获取这些属性的视图类型是一个固定的显式列表)

架构

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

<grid> (1)

架构根元素

  • 必填的 string 属性

  • 可选的 create、edit 和 delete 属性

  • 可选的 adjustment 和 adjust_name 属性

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

    在两种情况下,调整参数都作为 grid_adjust 上下文成员提供;在 object 情况下,参数还作为位置函数参数提供(位于空 id 列表之后):

    row_domain

    与被调整单元格整行匹配的域

    column_field

    被调整单元格的列名称

    column_value

    被调整单元格的列值

    cell_field

    被调整单元格的度量字段

    change

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

  • 可选的 hide_line_total 和 hide_column_total 属性

    hide_line_total

    设为 true 可隐藏合计行(默认 false)

    hide_column_total

    设为 true 可隐藏合计列(默认 false)

  • 可选的 dialog_size 属性

    dialog_size

    当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

    要求

    可选

    type

    str,取值为 sm、md、lg、xl、fs、fullscreen 之一

    默认

    ''

  • 可选的 barchart_total 属性

    barchart_total

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

  • 可选的 create_inline 和 display_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 属性,取值为 object 或 action

    注解

    不支持工作流按钮

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

  • 可选的 context

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

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

行分组字段,如果搜索视图有分组筛选,则会被其替代。

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

<field type="col"> (1)

列分组字段。

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

name

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

string

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

span

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

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

step

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

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

<field type="measure"> (1)

单元格字段,自动汇总(由 read_group 完成)。

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

服务器交互

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

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

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

      values (必填)

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

      domain (必填)

      该行来源处任意记录的域,用于在需要时于单元格调整过程中复制记录

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

      values (必填)

      参见行标题中的 values

      domain (必填)

      参见列的 domain 值

      current (可选)

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

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

      value

      与该单元格关联的数值

      domain

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

      size

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

      readonly (可选)

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

      classes (可选)

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

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

      请注意,网格数据是 密集 的:如果查询数据库没有得到与某个单元格匹配的分组,该单元格仍会生成一个“空”单元格,其必填键使用默认值。

    • prev 与 next,可以是假值(不启用分页),也可以是一个上下文项,合并到视图自身的上下文中以便 read_grid 上一页或下一页;应视为不透明

  • read_grid_domain(field, range) (由该模块在所有模型上提供)返回与网格当前配置的“跨度”相匹配的域。read_grid 内部也会做同样的处理,但有时需要单独调用它,以便与 search_count 或 read_group 等配合使用。

  • adjust_grid,目前尚无通用实现,其语义可能会随时间与使用场景而演变

服务器钩子

read_grid 会调用若干钩子,让您可以在内部自定义其操作,而无需重写整个方法:

_grid_format_cell(group, cell_field)

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

_grid_make_empty_cell(row_domain, column_domain, view_domain)

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

_grid_column_info(name, range)

根据列类型生成一个 ColumnMetadata 对象,其中存储的值要么直接返回(作为 read_grid 的一部分),要么用于查询并把 read_group 重新格式化为 read_grid:

grouping

列实际使用的分组字段/查询

domain

当列字段启用了分页时应用于 read_group 的域,可以为空列表

prev 与 next

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

values

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

values

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

domain

匹配该特定列的域

is_current

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

format

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

ACL

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

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

上下文键

grid_range

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

grid_anchor

如果适用,用作列范围的默认锚点,替代 read_grid 定义的默认值。

对于日期字段,用于计算初始范围的参照日期。默认日期锚点为“今天”(采用用户所在时区)

甘特图

Enterprise feature

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

甘特视图的根元素是 <gantt/>。它可以接受以下属性:

string

字符串(默认:'')

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

create

布尔值(默认:True)

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

edit

布尔值(默认:True)

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

delete

布尔值(默认: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 expression

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

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

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

这些值是 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,甘特视图将不支持任何拖放操作

create、cell_create、edit、delete、plan

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

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

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

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

  • plan:如果启用且 edit 也已启用,时间段上会显示一个“放大镜”按钮,用于将未分配的记录排入该时间段。

示例

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

offset

取决于时间刻度,要在今天基础上增加的单位数量,用于计算默认时间段。示例:在 default_scale 为 week 时偏移 +1 会打开下一周的甘特视图,在 default_scale 为 month 时偏移 -2 会打开两个月前的甘特视图。

progress

为记录的事件提供完成百分比(0 到 100 之间)的字段名称

string

甘特视图的标题

precision

指定各时间刻度下药丸吸附精度的 JSON 对象。

时间刻度 day 的可选值有(默认:hour):

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

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

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

时间刻度 week 的可选值有(默认:day:half):

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

  • day:half:记录时间吸附到半天(例如 7:28 AM 变为 12:00 PM)

时间刻度 month 的可选值有(默认:day:half):

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

  • day:half:记录时间吸附到半天(例如 7:28 AM 变为 12:00 PM)

时间刻度 year 始终吸附到整天。

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

total_row

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

collapse_first_level

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

display_unavailability

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

default_scale

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

  • day

  • week

  • month

  • year

scales

此视图允许的时间刻度列表,以逗号分隔。默认允许所有时间刻度。此列表中可用的时间刻度值请参阅 default_scale。

form_view_id

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

dynamic_range

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

pill_label

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

buffer_start

包含要在记录开始时间之前显示的时长(以小时为单位的浮点数)的字段名称。会在主药丸旁边渲染一个独立的任务前边距。

buffer_stop

包含要在记录结束时间之后显示的时长(以小时为单位的浮点数)的字段名称。会在主药丸旁边渲染一个独立的任务后边距。

thumbnails

如果分组是关联字段,这允许在分组名称旁显示缩略图。它需要一个 python 字典,其键为当前模型上的字段名称。值为关联模型上存放缩略图的字段名称。

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

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

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

schedule

如果设为 True,未排期的活动(开始日期和结束日期未设置的活动)会显示在侧边面板中,用户可以将这些活动拖放到甘特视图中,以便立即排期。

要求

可选

type

bool

默认

False

sample

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

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

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

要求

可选

type

bool

默认

False

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

组件

甘特视图只接受一种子元素: 弹出框。

点击记录(甘特图中的一个药丸)时会打开弹出框,显示其部分字段。当视图未定义 弹出框 元素时,弹出框中会显示开始日期和结束日期字段。

popover:自定义记录的弹出框

如需完全控制弹出框的结构,可以将单个 <popover> 元素作为 <gantt> 根元素的直接子元素添加,而不依赖上文描述的自动生成的弹出框。<popover> 元素的完整结构及其 card_id 属性请参阅 弹出框。

示例

<gantt date_start="start" date_stop="stop">
    <popover>
        <templates>
            <t t-name="popover-header">
                <field name="display_name"/>
            </t>
            <t t-name="popover-body">
                <field name="user_id"/>
                <field name="stage_id"/>
            </t>
            <t t-name="popover-footer" replace="0">
                <button name="action_custom" type="object" string="Custom Action"/>
            </t>
        </templates>
    </popover>
</gantt>

地图

Enterprise feature

该视图可以在地图上显示记录以及记录之间的路线。记录用标记点表示。它还允许在与记录标记点关联的弹出窗口中可视化模型中的字段。

注解

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

API

该视图使用位置数据平台的 API 来获取瓦片(地图背景)、进行地理正向解析(将地址转换为一组坐标)并获取路线。该视图实现了两种 API:OpenStreetMap 和 Mapbox。默认使用 OpenStreetMap,它能够获取 tiles 并进行 geoforwarding。该 API 不需要令牌。一旦在通用设置中提供了有效的 Mapbox 令牌,视图就会切换到 Mapbox API。该 API 速度更快,并支持计算路线。可以通过 signing up 注册 Mapbox 来获取令牌。

结构组件

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

res_partner

包含指向 res.partner 的 many2one。如果未提供,视图将退化为创建一张空地图。

default_order

如果提供了字段,视图会覆盖模型的默认排序。该字段必须属于应用该视图的模型,而不是来自 res.partner。

routing

该属性定义出行路径的计算与显示方式。要使用路线规划,视图需要一个有效的 Mapbox 令牌以及至少两条已定位的记录(如果提供了用户位置,则只需一条)。它支持 2 个取值,也可以省略以禁用路线规划(默认:省略):

  • optimized:系统会计算最高效的路线,以最小化所有记录之间的总行程时间。

  • ordered:路线严格遵循视图默认排序所定义的顺序。

hide_name

为 1 时,在地图标记的弹出框中隐藏名称(默认:0)。

hide_address

为 1 时,在地图标记的弹出框中隐藏地址(默认:0)。

limit

最多获取的记录数(默认:80)。它必须是正整数。

dialog_size

当视图作为对话框打开时(例如 target="new" 的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。

要求

可选

type

str,取值为 sm、md、lg、xl、fs、fullscreen 之一

默认

''

<map> 元素接受两种子元素:<field> 和 弹出框。

点击某条记录的地图标记时,会弹出一个弹出框来显示该记录的部分字段。如果视图未定义 弹出框 元素,这些字段就是直接声明在 <map> 根元素下的 <field> 元素;每个 <field> 按给定顺序解释为弹出框中的一行。字段的属性如下:

name

要显示的字段。

string

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

例如,以下是一个地图视图:

示例

<map res_partner="partner_id" default_order="date_begin" routing="ordered" hide_name="1">
    <field name="partner_id" string="Customer Name"/>
</map>

popover:自定义记录的弹出框

如果希望完全控制弹出框的结构,可以将单个 <popover> 元素添加为 <map> 根元素的直接子元素,而不必依赖上文所述自动生成的弹出框。有关 <popover> 元素的完整结构及其 card_id 属性的信息,请参阅 弹出框。

示例

<map res_partner="partner_id">
    <popover>
        <templates>
            <t t-name="popover-header">
                <field name="name"/>
            </t>
            <t t-name="popover-body">
                <field name="partner_id"/>
            </t>
            <t t-name="popover-footer">
                <button class="btn btn-secondary" type="object" name="my_method" string="Do something"/>
            </t>
        </templates>
    </popover>
</map>

弹出框

多种视图(日历、甘特图 和 地图)支持同一个 <popover> 元素,可借此自定义与其中某条记录交互时显示的弹出框(例如点击日历事件、地图标记或甘特图胶囊)。

如果希望完全控制弹出框的结构,可以将单个 <popover> 元素添加为视图根元素的直接子元素,而不必依赖根据视图字段自动生成的弹出框。各视图自身的文档会说明这种自动生成的弹出框是什么样子。

示例

<popover>
    <templates>
        <t t-name="popover-header">
            <field name="name"/>
        </t>
        <t t-name="popover-body">
            <field name="partner_id"/>
        </t>
        <t t-name="popover-footer">
            <button class="btn btn-secondary" type="object" name="my_method" string="Do something"/>
        </t>
    </templates>
</popover>

<popover> 元素接受以下属性:

card_id

用于渲染弹出框的 卡片视图 的 ID,作为下文所述 templates 元素的替代方案(或补充)。如果提供,则使用该卡片视图的主体来渲染弹出框。

要求

可选

type

int

它包含一个 templates 元素,用于定义渲染弹出框所需的 QWeb 模板。这些模板可以定义如下:

popover-header

如果已定义,则渲染为弹出框的页眉。默认情况下不显示页眉。

popover-body

弹出框的主体内容,相当于 卡片视图 中的 card 模板。如果未定义,弹出框会回退到视图自身文档中描述的默认内容;但如果提供了 card_id,则改为使用所引用卡片视图的主体。

popover-footer

如果已定义,则替换默认页脚,默认页脚只包含一个 编辑 或 查看 按钮(标签取决于用户的访问权限)。在 <t t-name="popover-footer"> 节点上设置 replace="0",可保留默认按钮并在其后追加自定义内容。

这些模板使用的 API 与 卡片视图模板 相同:<field> 节点、小组件、动态属性、t-if 等。渲染上下文与卡片视图完全相同。