视图架构¶
通用架构¶
视图的架构由 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
在视图中禁用/启用记录创建。
- 要求
可选
- 类型
- 默认值
True
- edit
在视图中禁用/启用记录编辑功能。
- 要求
可选
- 类型
- 默认值
True
- duplicate
通过 操作 下拉菜单禁用/启用视图上的记录复制。
- 要求
可选
- 类型
- 默认值
True
- delete
通过 操作 下拉菜单禁用/启用视图中的记录删除功能。
- 要求
可选
- 类型
- 默认值
True
- js_class
webclient将实例化的JavaScript组件的名称,而不是表单视图。
- 要求
可选
- 类型
字符串
- 默认值
''
- disable_autofocus
禁用视图中第一个字段的自动聚焦。
- 要求
可选
- 类型
- 默认值
False
语义组件¶
语义组件与 Odoo 系统集成,并允许与其进行交互。
表单视图接受以下子语义组件:字段、标签、按钮、讨论 和 附件。
占位符用全大写字母表示。
field
:显示字段值¶
field
元素渲染(并可能允许编辑)当前记录的单个字段。
在表单视图中多次使用同一个字段是支持的,这些字段可以接收不同的 invisible
和 readonly
属性值。这些字段可能具有相同的值,但可以以不同的方式显示。然而,当多个字段存在且 required
属性值不同时,行为无法保证。
<form>
<field name="FIELD_NAME"/>
</form>
field
元素可以具有以下属性:
- name
要渲染的字段名称。
- 要求
必填
- 类型
字符串
- widget
用于表示字段的小部件。所选小部件可以改变字段的渲染方式和/或编辑方式。它引用注册到
fields
注册表中的 JavaScript 实现(一个 Owl 组件)。- 要求
可选
- 类型
字符串
- id
节点 ID。当视图中有多个相同字段的实例时非常有用(参见 label:显示字段标签)。
- 要求
可选
- 类型
字符串
- 默认值
字段名称
- string
字段的标签。
- 要求
可选
- 类型
字符串
- 默认值
模型字段的
string
属性
- help
当鼠标悬停在字段或其标签上时显示的工具提示。
- 要求
可选
- 类型
字符串
- 默认值
''
- options
字段小部件的配置选项(包括默认小部件),以评估为字典的 Python 表达式形式提供。
对于关系字段,以下选项可用:
no_create
、no_quick_create
、no_open
和no_create_edit
。Example
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'FIELD_NAME', 'no_quick_create': True}"/>
- 要求
可选
- 类型
- 默认值
{}
- readonly
字段是否可以由用户修改(
False
)或为只读(True
),作为一个评估为布尔值的 Python 表达式。Example
<field name="fname_a" readonly="True"/> <field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
- 要求
可选
- 类型
- 默认值
False
- required
字段是否可以留空(
False
)或必须设置(True
),作为一个评估为布尔值的 Python 表达式。Example
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- 要求
可选
- 类型
- 默认值
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>
- 要求
可选
- 类型
- 默认值
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)]"/>
- 要求
可选
- 类型
- 默认值
[]
- 范围
关系字段
- 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, }"/>
- 要求
可选
- 类型
- 默认值
{}
- 范围
关系字段
- nolabel
是否应隐藏字段标签。
- 要求
可选
- 类型
- 默认值
False
- 范围
作为
group
元素直接子元素的字段
- placeholder
在 空 字段上显示的帮助消息。它可以在复杂表单中替代字段标签。然而,它 不应 是数据示例,因为用户可能会将占位符文本与已填写字段混淆。
- 要求
可选
- 类型
字符串
- 默认值
''
- mode
用于字段关联记录的显示模式(视图类型)的逗号分隔列表。允许的模式有:
list
、form
、kanban
和graph
。
- class
设置在生成元素上的 HTML 类。
样式使用 Bootstrap 框架和 UI 图标。常见的 Odoo 类包括:
oe_inline
:防止字段后通常的换行,并限制其跨度;oe_left
、oe_right
:将元素 浮动 到对应的方向;oe_read_only
、oe_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
字段
- kanban_view_ref
在移动环境中选择记录时应使用的特定看板 视图记录 的 XMLID。
- 要求
可选
- 类型
字符串
- 默认值
''
- 范围
关系字段
- default_focus
视图打开时字段是否获得焦点。它只能应用于视图中的一个字段。
- 要求
可选
- 类型
- 默认值
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_left
、oe_right
:将元素 浮动 到对应的方向;oe_read_only
、oe_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>
- 要求
可选
- 类型
- 默认值
False
讨论小部件¶
讨论小部件 是一种通信和日志工具,允许直接从记录(任务、订单、发票、事件、笔记等)发送电子邮件给同事和客户。
当模型继承 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
中的列数。- 要求
可选
- 类型
- 默认值
2
- colspan
子元素占用的列数。
- 要求
可选
- 类型
- 默认值
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>
- 要求
可选
- 类型
- 默认值
False
可能的结构及其渲染表示
<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>
notebook
和 page
:添加带标签的部分¶
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>
- 要求
可选
- 类型
- 默认值
False
可能的结构及其渲染表示
<form>
<notebook>
<page string="Page1">
...
</page>
<page string="Page2">
...
</page>
</notebook>
</form>
|
newline
:开始新的组行¶
newline
元素用于 组 元素内部,以提前结束当前行并立即切换到新行,而无需事先填充剩余列。
<form>
<group>
...
<newline/>
...
</group>
</form>
可能的结构及其渲染表示
<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
作为部分标题的标题。
- 要求
可选
- 类型
字符串
- 默认值
''
可能的结构及其渲染表示
<form>
<group>
<FIELD/>
<separator string="Title 1"/>
<FIELD/>
<group>
<FIELD/>
<separator string="Title 2"/>
<FIELD/>
</group>
<group>
<FIELD/>
<FIELD/>
</group>
</group>
</form>
|
小技巧
separator
元素可用于在同一内部 group
元素内的元素之间实现视觉分隔,同时保持它们的水平对齐。
标题容器¶
可以通过带有 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
应用程序的技术名称(模块的名称)。
- 要求
必填
- 类型
字符串
- 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>
- 要求
可选
- 类型
- 默认值
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>
- 要求
可选
- 类型
- 默认值
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>
- 要求
可选
- 类型
- 默认值
False
列表¶
列表视图的根元素是 list`(以前的名称为 `tree
)。
可能的结构及其渲染表示
<list>
...
</list>
|
根属性¶
可以向根元素 list
添加可选属性以自定义视图。
- string
视图标题。仅当您打开一个没有名称且目标为
new
的操作时(打开对话框)才会显示。- 要求
可选
- 类型
字符串
- 默认值
''
- create
在视图中禁用/启用记录创建。
- 要求
可选
- 类型
- 默认值
True
- edit
在视图中禁用/启用记录编辑功能。
- 要求
可选
- 类型
- 默认值
True
- delete
通过 操作 下拉菜单禁用/启用视图中的记录删除功能。
- 要求
可选
- 类型
- 默认值
True
- import
禁用/启用从视图中的数据导入记录。
- 要求
可选
- 类型
- 默认值
True
- export_xlsx
禁用/启用将记录导出到视图中的数据。
- 要求
可选
- 类型
- 默认值
True
- editable
使视图中的记录可就地编辑,并允许从列表的一行创建新记录。它可以有两个不同的值:
- top
新记录从列表顶部创建。
- bottom
新记录从列表底部创建。
内联 表单 视图的架构派生自列表视图。因此,大多数在表单视图字段和按钮上有效的属性也会被列表视图接受,但如果列表视图不可编辑,这些属性可能没有意义。
重要
如果
edit
属性设置为False
,则此行为将被禁用。- 要求
可选
- 类型
字符串
- 默认值
''
- multi_edit
激活多编辑功能,允许一次性将多个记录的字段更新为相同的值。
它仅接受值
'1'
。- 要求
可选
- 类型
字符串
- 默认值
''
- open_form_view
在每行末尾显示一个按钮,用于在表单视图中打开记录。
如果视图不可编辑,则无效。
- 要求
可选
- 类型
- 默认值
False
- default_group_by
如果没有通过操作或当前的 搜索 指定分组,则记录应默认按其分组的字段名称。
- 要求
可选
- 类型
字符串
- 默认值
''
- default_order
一个以逗号分隔的字段名称列表,用于覆盖通过
_order
属性在模型中定义的排序顺序。要反转某个字段的排序顺序,请在其后添加后缀
desc
,并用空格分隔。Example
<list default_order="sequence,name desc"> ... </list>
- 要求
可选
- 类型
字符串
- 默认值
''
- decoration-<style>
应用于匹配记录行的样式,以评估为布尔值的 Python 表达式形式提供。
<style>
必须替换为以下之一:bf`(粗体)、`it`(斜体)、`info
、warning
、danger
、muted
、primary
和success
。Example
<list decoration-danger="field_qty > field_limit"> ... </list>
- 要求
可选
- 类型
- 默认值
False
- limit
页面的默认大小。它必须严格为正。
- 要求
可选
- 类型
- 默认值
列表视图为
80
,表单视图中的 X2many 列表为40
- groups_limit
当列表视图分组时,页面上的默认组数。它必须严格为正。
- 要求
可选
- 类型
- 默认值
列表视图为
80
,表单视图中的 X2many 列表为40
- expand
当列表视图分组时,第一级组是否应默认展开。
警告
这可能会很慢,具体取决于组的数量。
- 要求
可选
- 类型
- 默认值
False
- sample
如果当前模型未找到任何记录,视图是否应填充一组示例记录。
这些虚拟记录对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而字段email
将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据交互,并且一旦执行操作(创建记录、添加列等),它们将被丢弃。
- 要求
可选
- 类型
- 默认值
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]"/>
- 要求
可选
- 类型
- 默认值
False
- required
字段是否可以留空(
False
)或必须设置(True
),作为一个评估为布尔值的 Python 表达式。Example
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- 要求
可选
- 类型
- 默认值
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>
- 要求
可选
- 类型
- 默认值
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')"/>
- 要求
可选
- 类型
- 默认值
False
- groups
以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的
!
操作符前缀来排除某些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
- 类型
字符串
- 默认值
''
- decoration-<style>
应用于匹配记录字段的样式,以评估为布尔值的 Python 表达式表示。
<style>
必须替换为以下之一:bf`(粗体)、`it`(斜体)、`info
、warning
、danger
、muted
、primary
和success
。Example
<field name="name" decoration-bf="1"/> <field name="quantity" decoration-info="state == 'draft'"/>
- 要求
可选
- 类型
- 默认值
False
- sum, avg
要在列底部显示的聚合值。聚合仅计算当前显示的记录。聚合操作必须与相应字段的
aggregator
匹配。Example
<field name="sent" sum="Total" /> <field name="clicks_ratio" avg="Average"/>
- 要求
可选
- 类型
字符串
- 默认值
''
- width
列表视图总是尝试在列之间优化可用空间。对于某些字段类型,这是通过强制设置宽度来实现的,具体取决于字段类型。例如,我们确切知道显示日期所需的像素数量,因此可以确保日期字段的列不会占用超过严格必要的空间,从而为其他列留出多余的空间。然而,框架无法猜测每种字段类型的适当宽度。例如,字符字段可以用于编码大值或3个字母的国家代码。在后一种情况下,可以直接在架构中设置宽度(例如
width="40px"
)。它表示渲染单元格内值所需的宽度(始终以像素为单位)。列的宽度将是给定值与单元格左右内边距的总和。- 要求
可选
- 类型
字符串
- 默认值
''
- nolabel
字段的列标题是否应保持为空。如果设置,则该列将不可排序。
它仅接受值
'1'
。- 要求
可选
- 类型
字符串
- 默认值
''
注解
当列表视图分组时,数值字段会被聚合并为每个组显示。此外,如果一个组中有太多记录,分页器会出现在组行的右侧。因此,在列表视图可能分组的情况下,将数值字段放在最后一列是一个不好的做法。然而,这对表单视图中的 X2many 字段没有问题,因为它们无法分组。
可能的结构及其渲染表示
<list>
<field name="name" string="My Custom Name"/>
<field name="amount" sum="Total"/>
<field name="currency_id"/>
<field name="tax_id"/>
</list>
|
groupby
:定义组标题¶
groupby
元素用于在对 Many2one
字段进行分组时,通过 按钮 元素定义组标题。它还接受 字段 元素,这些字段可用于修饰符。因此,这些字段属于 Many2one 的共模型。这些额外字段会批量获取。
<list>
...
<groupby name="FIELD_NAME">
<BUTTONS/>
<FIELDS/>
</groupby>
</list>
groupby
元素可以具有以下属性:
可能的结构及其渲染表示
<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
元素内的字段仅用于获取和存储值,但永远不会显示。
搜索¶
搜索视图与其他视图类型不同,因为它们不用于显示内容。尽管它们适用于特定模型,但它们用于过滤另一个视图的内容(通常是聚合视图;例如,列表 和 图表)。
搜索视图的根元素是 search
。
它不接受任何属性。
可能的结构及其渲染表示
<search>
...
</search>
|
组件¶
搜索视图接受以下子元素:字段、过滤器、分隔符、组 和 搜索面板。
占位符用全大写字母表示。
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
属性更灵活的域(例如,同时搜索多个字段)。如果同时提供了
operator
和filter_domain
属性,则filter_domain
优先。- 要求
可选
- 类型
- 默认值
[]
- context
要合并到搜索视图目标视图上下文中的上下文,以评估为字典的 Python 表达式形式表示。
它可以包含用户提供的值,这些值在
self
变量下可用。- 要求
可选
- 类型
- 默认值
{}
- domain
应用于支持自动完成的字段(例如,
Many2one
)的补全结果的过滤器。- 要求
可选
- 类型
- 默认值
[]
- 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>
- 要求
可选
- 类型
- 默认值
False
可能的结构及其渲染表示
<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
元素可以具有以下属性:
- string
过滤器的标签。
- 要求
必填
- 类型
字符串
- help
悬停过滤器时显示的工具提示。
- 要求
可选
- 类型
字符串
- 默认值
''
- domain
作为搜索域的一部分附加到操作域的域。
- 要求
可选
- 类型
- 默认值
[]
- date
要过滤的
date
或datetime
字段的名称。当使用此属性时,它会在 过滤器 菜单的子菜单中创建一组可用的过滤器。这些过滤器是时间相关的,但并非动态的,因为它们的域是在控制面板实例化时评估的。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date"/>
默认情况下,这些过滤器包含一个下拉菜单,其中包含不同的子过滤器,允许您按月、季度和年份进行过滤。此外,您可以创建允许使用域进行过滤的自定义子过滤器。这些自定义过滤器必须具有以下属性:
name
、string
和domain
。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', '>', 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"/>
如果当前月份是二月,下拉菜单中可选择的最早月份将是十一月。
- 要求
可选
- 类型
- 默认值
-2
- 范围
具有非空
date
属性的过滤器
- end_month
日期过滤器下拉菜单中显示的最晚月份,作为相对于当前月份的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" end_month="2"/>
如果当前月份是二月,下拉菜单中可选择的最晚月份将是三月。
- 要求
可选
- 类型
- 默认值
0
- 范围
具有非空
date
属性的过滤器
- start_year
日期过滤器下拉菜单中显示的最早年份,作为相对于当前年份的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" start_year="-3"/>
如果当前年份是 2024 年,下拉菜单中可选择的最早年份将是 2021 年。
- 要求
可选
- 类型
- 默认值
-2
- 范围
具有非空
date
属性的过滤器
- end_year
日期过滤器下拉菜单中显示的最晚年份,作为相对于当前年份的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" end_year="2"/>
如果当前年份是 2024 年,下拉菜单中可选择的最晚年份将是 2025 年。
- 要求
可选
- 类型
- 默认值
0
- 范围
具有非空
date
属性的过滤器
- default_period
基于时间的过滤器(带有
date
属性)的默认周期。它必须是以下之一,或有效过滤器 ID 的逗号分隔列表。有效的过滤器 ID 包括以下内容:
第一季度
、第二季度
、第三季度
和第四季度
。month
、month-x
和month+x
中的一个,其中x
是介于start_month
和end_month
之间的非零整数值。year
、year-x
和year+x
中的一个,其中x
是介于start_year
和end_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', '>', 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>
- 要求
可选
- 类型
- 默认值
False
- groups
以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的
!
操作符前缀来排除某些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
- 类型
字符串
- 默认值
''
- context
合并到操作域中以生成搜索域的上下文
上下文键
group_by
设置为字段值,可用于定义在 分组依据 菜单中可用的分组。当字段类型为date
或datetime
时,过滤器会生成 分组依据 菜单的子菜单,并提供以下间隔选项:年、季度、月、周 和 日。当过滤器在视图初始化时激活的默认过滤器集合中时,默认情况下记录按月分组。可以通过使用语法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
。- 要求
可选
- 类型
- 默认值
{}
小心
没有非过滤器元素分隔的过滤器序列被视为包容性组合:它们将通过 OR
组合,而不是通常的 AND
。
Example
<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>
state
字段为 draft
或 done
的记录将显示。
Example
<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('delay', '<', 15)]"/>
state
字段为 draft
且 delay
字段小于 15 的记录将显示。
可能的结构及其渲染表示
<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
最多只能选择一个值。支持的字段类型为
many2one
和selection
。
- multi
可以选择多个值。支持的字段类型为
many2one
、many2many
和selection
。
- 要求
可选
- 类型
字符串
- 默认值
one
- groups
以逗号分隔的用户组列表,元素将对这些组显示。不属于这些组中至少一个的用户将无法看到该元素。可以使用负的
!
操作符前缀来排除某些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
- 类型
字符串
- 默认值
''
- icon
字段的图标。
- 要求
可选
- 类型
字符串
- 默认值
''
- color
字段的颜色。
- 要求
可选
- 类型
字符串
- 默认值
''
当 field
元素设置了 select=one
属性时,它可以具有以下附加属性:
当 field
元素设置了 select=multi
属性时,它可以具有以下附加属性:
- enable_counters
如果记录计数器非零,是否计算并显示它。
小技巧
此属性的存在是为了避免影响性能。另一种解决性能问题的方法是重写
search_panel_select_range
和search_panel_select_multi_range
方法。- 要求
可选
- 类型
- 默认值
False
- expand
是否显示没有记录的类别和过滤器。
- 要求
可选
- 类型
- 默认值
False
- limit
字段要获取的最大值数量。如果达到限制,则不会在搜索面板上显示任何值,而是显示错误消息。如果设置为 0,则获取所有值。
- 要求
可选
- 类型
- 默认值
200
- domain
记录必须满足的条件。
Example
<searchpanel> <field name="department_id"/> <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/> </searchpanel>
- 要求
可选
- 类型
- 默认值
[]
搜索默认值¶
可以通过操作的 context
使用 search_default_name
键配置搜索字段和过滤器。对于字段,值必须是要设置到字段的值;对于过滤器,必须是布尔值或数字。
Example
对于字段 foo
和过滤器 bar
,以下操作上下文将在 acro
上搜索 foo
并默认启用 bar
:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
可以使用数字值(介于 1 和 99 之间)定义默认 groupby 过滤器的顺序。
Example
对于两个 groupby 过滤器 foo
和 bar
,以下操作上下文将首先启用 bar
,然后启用 foo
。
{
'search_default_foo': 2,
'search_default_bar': 1
}
看板¶
看板视图用作 看板 可视化工具:它们将记录显示为“卡片”,介于 列表 和 表单 视图之间。
记录可以按列分组,用于工作流可视化或操作(例如任务或工作进度管理),也可以不分组(仅用于可视化记录)。
看板视图的根元素是 kanban
。
可能的结构及其渲染表示
<kanban>
...
</kanban>
|
注解
看板视图加载并显示最多十列。之后的任何列都会被折叠,但用户仍然可以展开它们。
根属性¶
可以向根元素 kanban
添加可选属性以自定义视图。
- string
视图标题。仅当您打开一个没有名称且目标为
new
的操作时(打开对话框)才会显示。- 要求
可选
- 类型
字符串
- 默认值
''
- create
在视图中禁用/启用记录创建。
- 要求
可选
- 类型
- 默认值
True
- edit
在视图中禁用/启用记录编辑功能。
- 要求
可选
- 类型
- 默认值
True
- delete
通过 操作 下拉菜单禁用/启用视图中的记录删除功能。
- 要求
可选
- 类型
- 默认值
True
- default_group_by
如果没有通过操作或当前的 搜索 指定分组,则记录应默认按其分组的字段名称。
- 要求
可选
- 类型
字符串
- 默认值
''
- default_order
一个以逗号分隔的字段名称列表,用于覆盖通过
_order
属性在模型中定义的排序顺序。要反转某个字段的排序顺序,请在其后添加后缀
desc
,并用空格分隔。Example
<list default_order="sequence,name desc"> ... </list>
- 要求
可选
- 类型
字符串
- 默认值
''
- class
向视图的根 HTML 元素添加 HTML 类。
- 要求
可选
- 类型
字符串
- 默认值
''
- examples
在分组看板视图中创建新列时,可以在
KanbanExamplesRegistry
中浏览的示例的键。- 要求
可选
- 类型
字符串
- 默认值
''
- group_create
添加新列 栏是否可见。
- 要求
可选
- 类型
- 默认值
True
- group_delete
是否可以通过齿轮菜单删除列。
- 要求
可选
- 类型
- 默认值
True
- group_edit
是否可以通过齿轮菜单编辑列。
- 要求
可选
- 类型
- 默认值
True
- groups_draggable
列是否可以重新排序。
- 要求
可选
- 类型
- 默认值
True
- records_draggable
当看板视图分组时,记录是否可以拖动。
- 要求
可选
- 类型
- 默认值
True
- archivable
当模型上定义了
active
字段时,属于某列的记录是否可以归档和取消归档。- 要求
可选
- 类型
- 默认值
True
- quick_create
是否可以在不切换到表单视图的情况下创建记录。
- 要求
可选
- 类型
- 默认值
当看板视图按 many2one、selection、char 或 boolean 字段分组时为
True
,否则为False
。
- quick_create_view
使用快速创建记录时打开的 表单 视图的引用。
- 要求
可选
- 类型
字符串
- 默认值
''
- on_create
点击 创建 时调用的自定义操作。
如果设置为
'quick_create'
,则使用快速创建记录。如果快速创建被禁用,则调用标准的创建操作。- 要求
可选
- 类型
字符串
- 默认值
''
- can_open
默认情况下,点击看板卡片会在表单视图中打开对应的记录。通过将属性
can_open
设置为False
可以禁用此行为。- 要求
可选
- 类型
- 默认值
True
- highlight_color
用于为看板卡片的左边框着色的整数字段名称。
- 要求
可选
- 类型
字符串
- sample
如果当前模型未找到任何记录,视图是否应填充一组示例记录。
这些虚拟记录对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而字段email
将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据交互,并且一旦执行操作(创建记录、添加列等),它们将被丢弃。
- 要求
可选
- 类型
- 默认值
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
一个包含视图中所有字段的对象。每个字段有两个属性:
value
和raw_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
指示该视图为只读。
- 类型
- selection_mode
是否在选择 many2one 或 many2many 字段时打开看板视图(在移动环境中)。
- 类型
- 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>
要在卡片侧面显示某些内容(例如图像),可以使用 aside
和 main
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>
progressbar
:在列顶部显示进度条¶
progressbar
元素用于定义在分组看板视图的看板列顶部显示的进度条。
<kanban>
<progressbar field="FIELD_NAME"/>
...
</kanban>
progressbar
元素可以具有以下属性:
- field
进度条的子组所基于的字段名称。
- 要求
必填
- 类型
字符串
- colors
进度条字段值与颜色值
muted
、success
、warning
和danger
的映射。- 要求
必填
- 类型
- sum_field
在进度条旁边显示的总和中使用的字段名称。如果未设置,则显示记录的总数。
- 要求
可选
- 类型
字符串
- 默认值
''
可能的结构及其渲染表示
<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)、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
的形式。用户无法与这些数据交互,并且一旦执行操作(创建记录、添加列等),它们将被丢弃。
- 要求
可选
- 类型
- 默认值
False
图表视图中唯一允许的元素是 field
,它可以具有以下属性:
name
(必填)要在视图中使用的字段名称。如果用于分组(而不是聚合)。
invisible
(可选)如果为 true,则该字段不会出现在活动度量或可选度量中。
type
(可选)如果设置为
measure
,则该字段将用作组内的聚合值,而不是分组条件。它仅适用于具有该属性的最后一个字段,但对其他具有字符串属性的字段也很有用(见下文)。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>
,可以接受以下属性:
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
的形式。用户无法与这些数据交互,并且一旦执行操作(创建记录、添加列等),它们将被丢弃。
- 要求
可选
- 类型
- 默认值
False
度量会自动从模型字段生成;仅使用可聚合字段。这些度量还会按字段的字符串进行字母顺序排序。
警告
与图表视图类似,透视表视图在数据库内容上聚合数据,这意味着非存储的函数字段不能用于透视表视图。
在透视表视图中,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>
。日历视图上可用的属性包括:
- 字符串
字符串(默认值:
''
)此视图标题仅在打开没有名称且目标为 ‘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
加载日历时的默认显示模式。可能的属性包括:
day
、week
、month
、year
。scales
以逗号分隔的刻度列表。默认情况下,所有刻度都可用。有关可能的刻度值,请参见 mode。
create
、delete
通过将相应属性设置为
false
,可以禁用视图中的相应操作。<field>
声明要聚合或用于看板 逻辑 的字段。如果字段只是简单地显示在日历卡片中。
字段可以具有以下附加属性:
invisible
使用 “True” 隐藏卡片中的值。
avatar_field
仅适用于 x2many 字段,用于在卡片中显示头像而不是 display_name。
write_model
、write_field
和filter_field
您可以添加一个过滤器并将结果保存到定义的模型中,该过滤器会添加到侧边栏中。
filter_field
是可选的,允许您指定一个字段来保存过滤器的状态。filters
和color
使用 “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
一个对象,所有请求的字段作为其属性。每个字段有两个属性:
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
(可选)用于描述时间轴的字符串。它应该是“向后”或“向前”(默认值)。向前时间轴将从 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
的形式。用户无法与这些数据交互,并且一旦执行操作(创建记录、添加列等),它们将被丢弃。
- 要求
可选
- 类型
- 默认值
False
网格¶
Enterprise feature限制¶
此视图仍在开发中,可能需要扩展或修改。
仅对
date
列字段进行了测试,selection
和many2one
虽然名义上已实现并支持,但尚未经过测试,而datetime
完全未实现。列单元格几乎不可配置,且必须为数值型。
单元格调整默认禁用,必须进行配置才能启用。
由于
fields_view_get
后处理的限制,create
、edit
和delete
的 ACL 元数据不会自动设置在视图根节点上(有一个固定的显式列表指定哪些视图类型会获取这些属性)。
架构¶
网格视图在此模块中有自己的架构和额外的验证。视图架构如下:
<grid>
(1)架构根元素
必填的
string
属性可选的
create
、edit
和delete
属性可选的
adjustment
和adjust_name
属性adjustment
可以是object
或action
,用于指示单元格调整应通过方法调用还是操作执行来完成。adjust_name
分别提供方法名称和操作 ID。在这两种情况下,调整参数都作为
grid_adjust
上下文成员提供,在object
情况下,参数还作为位置函数参数提供(紧邻一个空的 ID 列表)。row_domain
与调整单元格所在整行匹配的域
column_field
调整单元格所在列的名称
column_value
调整单元格所在列的值
cell_field
调整单元格的度量字段
change
单元格旧值与调整值之间的差异,可以为正或负
可选的
hide_line_total
和hide_column_total
属性hide_line_total
设置为 true 以隐藏总计行(默认值为 false)
hide_column_total
设置为 true 以隐藏总计列(默认值为 false)
可选的
barchart_total
属性barchart_total
设置为
true
以在网格底部显示基于列总计的条形图(默认值为 false)。
可选的
create_inline
和display_empty
属性create_inline
设置为
true
以在网格底部显示一个额外的行,并包含一个“添加一行”按钮(默认值为 false)。当此选项设置为true
时,控制面板中的“添加一行”按钮将被隐藏。如果没有数据可用且未设置display_empty
(即显示帮助内容时),控制面板中的“添加一行”按钮将显示出来,以便用户创建第一条记录。display_empty
设置为
true
以在没有数据时继续显示网格(默认值为 false)。这在您希望用户能够跟踪当前时间段时非常有用(因为日期会显示在列标题中)。提醒一下,当没有数据且未设置此属性时,将显示帮助内容而不是网格。
<button>
(0+)常规的 Odoo 操作按钮,显示在视图头部。
必填的
string
属性(按钮标签)必填的
type
属性,可以是object
或action
注解
不支持工作流按钮
必填的
name
属性,可以是要调用的方法名称或要执行的操作 ID可选的
context
服务器回调会提供视图中显示的所有记录 ID,这些 ID 可能作为方法的参数传递(
object
按钮),也可能作为上下文的active_ids
(action
按钮)。<field type="row">
(1+)行分组字段,如果有搜索视图的 groupby 过滤器,则会被替换。
视图中
row
字段的顺序决定了它们的分组深度:如果第一个字段是school
,第二个字段是age
,则记录将首先按school
分组,然后在每个学校内按age
分组。<field type="col">
(1)列分组字段。
列字段可以包含 0 个或多个
<range>
元素,用于指定可自定义的列范围。range
元素具有以下必填属性:name
可以通过
grid_range
上下文值覆盖默认范围(默认为第一个范围)。字符串
范围按钮的标签(用户可见)。
span
一次性在视图中显示所有列的跨度的符号名称,可能会触发分页。
对于
date
字段,目前有效的跨度是week
和month
。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_
)发生冲突,则忽略此列表中的类。
请注意,网格数据是 密集的,如果查询数据库未找到与单元格匹配的组,则会生成一个具有必填键默认值的“空”单元格。
prev
和next
可以是假值(无分页),也可以是要合并到视图自身上下文中以读取前一页或后一页的上下文项,应假定为不透明。
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¶
如果视图不可编辑,则单个单元格也将不可编辑。
如果视图不可创建,则不会显示“添加一行”按钮(它目前会创建一条新的空记录)。
上下文键¶
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 上下文颜色 之一(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,则甘特图视图将不支持任何拖放操作
consolidation
用于在记录单元格中显示汇总值的字段名称
consolidation_max
字典,以“group by”字段为键,最大汇总值为值,超过该值时单元格将以红色显示(例如,
{"user_id": 100}
)consolidation_exclude
描述任务是否应排除在汇总之外的字段名称。如果设置为 true,则在汇总行中显示条纹区域
create
、cell_create
、edit
、delete
、plan
通过将相应属性设置为
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
的形式。用户无法与这些数据交互,并且一旦执行操作(创建记录、添加列等),它们将被丢弃。
- 要求
可选
- 类型
- 默认值
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>