视图架构¶
通用架构¶
视图的架构由 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
。
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
上以自定义视图。
- create
禁用/启用视图上的记录创建。
- Requirement
可选的
- 类型
- 默认
True
- edit
禁用/启用视图上的记录编辑。
- Requirement
可选的
- 类型
- 默认
True
- duplicate
通过 操作 下拉菜单在视图上禁用/启用记录复制。
- Requirement
可选的
- 类型
- 默认
True
- delete
通过 操作 下拉菜单禁用/启用视图上的记录删除功能。
- Requirement
可选的
- 类型
- 默认
True
- js_class
webclient 将实例化的 JavaScript 组件的名称,而不是表单视图。
- Requirement
可选的
- 类型
- 默认
''
- disable_autofocus
禁用自动聚焦视图中的第一个字段。
- Requirement
可选的
- 类型
- 默认
False
语义组件¶
语义组件与 Odoo 系统紧密集成,并允许与其进行交互。
表单视图接受以下子语义组件:字段、标签、按钮、Chatter 小部件 和 附件预览小部件。
占位符以全大写字母表示。
field
: display field values¶
field
元素用于渲染(并可能允许编辑)当前记录的单个字段。
在表单视图中多次使用同一字段是支持的,并且这些字段可以为 invisible
和 readonly
属性接收不同的值。这些字段可能具有相同的值,但可以以不同的方式显示。然而,当存在多个字段且 required
属性具有不同值时,行为无法保证。
<form>
<field name="FIELD_NAME"/>
</form>
field
元素可以具有以下属性:
- name
要渲染的字段名称。
- Requirement
强制性的
- 类型
- widget
用于表示字段的小部件。所选的小部件可以改变字段的渲染方式和/或编辑方式。它指的是注册到
fields
注册表中的 Javascript 实现(一个 Owl 组件)。- Requirement
可选的
- 类型
- id
节点 ID。当视图中同一字段出现多次时非常有用(参见 label: display field labels)。
- Requirement
可选的
- 类型
- 默认
字段名称
- string
字段的标签。
- Requirement
可选的
- 类型
- 默认
模型字段的
string
属性
- help
当悬停在字段或其标签上时显示的工具提示。
- Requirement
可选的
- 类型
- 默认
''
- 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}"/>
- Requirement
可选的
- 类型
- 默认
{}
- readonly
字段是否可由用户修改(
False
)或为只读(True
),作为一个评估为布尔值的Python表达式。Example
<field name="fname_a" readonly="True"/> <field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
- Requirement
可选的
- 类型
- 默认
False
- required
字段是否可以留空(
False
)或必须设置(True
),作为一个评估为布尔值的Python表达式。Example
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- Requirement
可选的
- 类型
- 默认
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>
- Requirement
可选的
- 类型
- 默认
False
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- domain
在显示现有记录以供选择时应用的过滤器,作为一个评估为 domain 的 Python 表达式。
Example
<field name="fname" domain="[('fname_a', '=', parent.fname_b)]"/>
- Requirement
可选的
- 类型
- 默认
[]
- Scope
关联字段
- 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, }"/>
- Requirement
可选的
- 类型
- 默认
{}
- Scope
关联字段
- nolabel
是否应隐藏字段标签。
- Requirement
可选的
- 类型
- 默认
False
- Scope
作为
group
元素直接子元素的字段
- placeholder
显示在 空 字段上的帮助信息。它可以在复杂表单中替代字段标签。然而,它 不应 是数据的示例,因为用户可能会将占位符文本与已填写的字段混淆。
- Requirement
可选的
- 类型
- 默认
''
- mode
用于字段链接记录的显示模式(视图类型)的逗号分隔列表。允许的模式有:
list
、form
、kanban
和graph
。
- class
要在生成的元素上设置的 HTML class 。
样式使用了 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>
- Requirement
可选的
- 类型
- 默认
''
- default_focus
视图打开时是否聚焦该字段。此设置只能应用于视图中的一个字段。
- Requirement
可选的
- 类型
- 默认
False
注解
关系字段 节点可以包含特定的子视图。
Example
<field name="children_ids">
<list>
<field name="name"/>
</list>
<form>
<field name="id"/>
<field name="name"/>
</form>
</field>
label
: display field labels¶
当 field 组件没有直接放置在 group 内,或者当其 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(在 field 上设置的
id
属性)。当视图中同一字段出现多次,并且有多个
label
组件与这些字段节点相关联时,这些标签必须具有唯一的for
属性;在这种情况下,引用相应字段节点的id
属性。- Requirement
强制性的
- 类型
- string
要显示的标签。
- Requirement
可选的
- 类型
- 默认
字段的标签来自模型上的字段定义
- class
要在生成的元素上设置的 HTML class 。
样式使用了 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>
- Requirement
可选的
- 类型
- 默认
''
- 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>
- Requirement
可选的
- 类型
- 默认
False
Chatter 小部件¶
The chatter widget 是通信和日志工具,允许直接从记录(任务、订单、发票、事件、笔记…)中向同事和客户发送电子邮件。
当模型继承 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, sheet, notebook, notebook, newline, separator, header, footer, 按钮容器, 和 标题容器。
占位符以全大写字母表示。
group
: define columns layouts¶
group
元素用于定义表单中的列布局。默认情况下,组定义两列,且组的大多数直接子元素占据一列。
作为组直接子元素的 field 元素默认会显示一个 label
,并且标签和字段本身的 colspan
都为 1
。
子元素水平排列(在换行之前,它们会尝试填充下一列)。
<form>
<group>
...
</group>
</form>
group
元素可以具有以下属性:
- string
为该组显示的标题。
- Requirement
可选的
- 类型
- 默认
''
- col
group
中的列数。- Requirement
可选的
- 类型
- 默认
2
- colspan
子元素占据的列数。
- Requirement
可选的
- 类型
- 默认
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>
- Requirement
可选的
- 类型
- 默认
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 根元素的直接子元素使用,以实现更窄且更具响应性的表单布局(居中页面、边距等)。它通常包含 group 元素。
<form>
<sheet>
...
</sheet>
</form>
notebook
和 page
:添加选项卡部分¶
notebook
元素定义了一个带标签的部分。每个标签通过一个 page
子元素定义。
notebook
元素不应放置在 group
元素内。
<form>
<notebook>
<page string="LABEL">
...
</page>
</notebook>
</form>
page
元素可以具有以下属性:
- string
选项卡的标题。
- Requirement
可选的
- 类型
str
- 默认
''
- 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>
- Requirement
可选的
- 类型
- 默认
False
可能的渲染结构和表示
<form>
<notebook>
<page string="Page1">
...
</page>
<page string="Page2">
...
</page>
</notebook>
</form>
|
newline
: start new group rows¶
newline
元素用于 group 元素内,以提前结束当前行并立即切换到新行,而无需事先填充任何剩余的列。
<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
作为章节标题的标题。
- Requirement
可选的
- 类型
str
- 默认
''
可能的渲染结构和表示
<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
元素创建一个标题 field 元素容器。
<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
: declare the application¶
app
元素用于在设置视图中声明应用程序。它会在视图的侧边栏上创建一个带有应用程序徽标的条目。在搜索时,它还充当分隔符。
<form>
<app string="NAME" name="TECHNICAL_NAME">
...
</app>
</form>
app
元素可以具有以下属性:
- string
应用程序的名称。
- Requirement
强制性的
- 类型
- name
应用程序的技术名称(模块的名称)。
- Requirement
强制性的
- 类型
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- 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>
- Requirement
可选的
- 类型
- 默认
False
block
:声明一组设置¶
block
元素用于声明一组设置。此组可以包含标题和描述。
<form>
<app string="NAME" name="TECHNICAL_NAME">
...
<block title="TITLE">
...
</block>
...
</app>
</form>
block
元素可以具有以下属性:
- title
设置块的标题。可以根据其值进行搜索。
- Requirement
可选的
- 类型
- 默认
''
- help
设置块的描述。可以根据其值进行搜索。
- Requirement
可选的
- 类型
- 默认
''
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- 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>
- Requirement
可选的
- 类型
- 默认
False
setting
: declare the 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
默认情况下,设置项在视觉上分为两个面板(左侧和右侧),用于编辑给定的 字段。通过定义
type="header"
,会渲染一种特殊的设置项。此设置项用于修改其他设置项的范围。例如,在网站应用程序中,此设置项用于指示其他设置项适用于哪个网站。标题设置项在视觉上表现为屏幕顶部的横幅。- Requirement
可选的
- 类型
- 默认
''
- string
用作设置标签的文本。
- Requirement
可选的
- 类型
- 默认
第一个字段的标签
- title
用作工具提示的文本。
- Requirement
可选的
- 类型
- 默认
''
- help
设置的描述。此文本显示在设置标签下方(带有
text-muted
类)。- Requirement
可选的
- 类型
- 默认
''
- company_dependent
该设置是否为公司特定。如果设置,将在设置标签旁边显示一个图标。
它仅接受值
'1'
。- Requirement
可选的
- 类型
- 默认
''
- documentation
设置的文档 path 。如果设置了,将在设置标签旁边显示一个可点击的图标。路径可以是绝对路径或 relative path 。在后一种情况下,它是相对于
https://www.odoo.com/documentation/<version>
的。- Requirement
可选的
- 类型
path_
- 默认
''
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- 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>
- Requirement
可选的
- 类型
- 默认
False
列表¶
列表视图的根元素是 list`(之前的名称是 `tree
)。
可能的渲染结构和表示
<list>
...
</list>
|
根属性¶
可选属性可以添加到根元素 list
以自定义视图。
- create
禁用/启用视图上的记录创建。
- Requirement
可选的
- 类型
- 默认
True
- edit
禁用/启用视图上的记录编辑。
- Requirement
可选的
- 类型
- 默认
True
- delete
通过 操作 下拉菜单禁用/启用视图上的记录删除功能。
- Requirement
可选的
- 类型
- 默认
True
- import
禁用/启用从视图数据导入记录。
- Requirement
可选的
- 类型
- 默认
True
- export_xlsx
禁用/启用视图上的记录导出到数据。
- Requirement
可选的
- 类型
- 默认
True
- editable
使视图的记录可原地编辑,并允许从列表的一行创建新记录。它可以有两个不同的值:
- top
新记录从列表顶部开始创建。
- bottom
新记录从列表底部创建。
内联 表单 视图的架构源自列表视图。因此,表单视图字段和按钮上有效的大多数属性也被列表视图接受,尽管如果列表视图不可编辑,这些属性可能没有任何意义。
重要
如果
edit
属性设置为False
,则此行为将被禁用。- Requirement
可选的
- 类型
- 默认
''
- multi_edit
激活多编辑功能,允许将字段更新为多个记录的相同值。
它仅接受值
'1'
。- Requirement
可选的
- 类型
- 默认
''
- open_form_view
在每行末尾显示一个按钮,以在表单视图中打开记录。
如果视图不可编辑,则此操作无效。
- Requirement
可选的
- 类型
- 默认
False
- default_order
一个以逗号分隔的字段名称列表,用于覆盖通过
_order
属性在模型上定义的排序。要反转字段的排序顺序,在其后加上
desc
,并用空格分隔。Example
<list default_order="sequence,name desc"> ... </list>
- Requirement
可选的
- 类型
- 默认
''
- decoration-<style>
应用于匹配记录行的样式,作为一个评估为布尔值的Python表达式。
<style>
必须替换为以下之一:bf`(加粗)、`it`(斜体)、`info
、warning
、danger
、muted
、primary
和success
。Example
<list decoration-danger="field_qty > field_limit"> ... </list>
- Requirement
可选的
- 类型
- 默认
False
- limit
页面的默认大小。它必须严格为正数。
- Requirement
可选的
- 类型
- 默认
80
用于列表视图,40
用于表单视图中的 X2many 列表
- groups_limit
列表视图分组时,页面上的默认分组数量。该值必须严格为正数。
- Requirement
可选的
- 类型
- 默认
80
用于列表视图,40
用于表单视图中的 X2many 列表
- expand
是否在列表视图分组时默认展开第一级分组。
警告
可能会很慢,取决于组的数量。
- Requirement
可选的
- 类型
- 默认
False
- sample
如果当前模型未找到任何记录,是否应使用一组示例记录填充视图。
这些假记录针对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而email
字段将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据进行交互,一旦执行了操作(记录创建、列添加等),这些数据将被丢弃。
- Requirement
可选的
- 类型
- 默认
False
组件¶
列表视图接受以下子元素:字段、按钮、分组、标题、控制和创建。
占位符以全大写字母表示。
field
: display field values¶
field
元素将所有当前记录的单个字段呈现(并可能允许编辑)为一列。
在列表视图中多次使用同一字段是不被支持的
<list>
<field name="FIELD_NAME"/>
</list>
field
元素可以具有以下属性:
- name
要渲染的字段名称。
- Requirement
强制性的
- 类型
- widget
用于表示字段的小部件。所选的小部件可以改变字段的渲染方式和/或编辑方式。它指的是注册到
fields
注册表中的 Javascript 实现(一个 Owl 组件)。- Requirement
可选的
- 类型
- string
字段的标签。
- Requirement
可选的
- 类型
- 默认
模型字段的
string
属性
- optional
使字段的可见性可选。字段的列可以通过视图标题上的按钮隐藏或显示。
它可以有两个不同的值:
- show
默认显示该字段。
- hide
该字段默认隐藏。
Example
<field name="fname_a" optional="show"/> <field name="fname_b" optional="hide"/>
- Requirement
可选的
- 类型
- readonly
字段是否可由用户修改(
False
)或为只读(True
),作为一个评估为布尔值的Python表达式。Example
<field name="fname_a" readonly="True"/> <field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
- Requirement
可选的
- 类型
- 默认
False
- required
字段是否可以留空(
False
)或必须设置(True
),作为一个评估为布尔值的Python表达式。Example
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- Requirement
可选的
- 类型
- 默认
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>
- Requirement
可选的
- 类型
- 默认
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')"/>
- Requirement
可选的
- 类型
- 默认
False
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- 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'"/>
- Requirement
可选的
- 类型
- 默认
False
- sum, avg
显示在列底部的聚合值。聚合仅基于当前显示的记录进行计算。聚合操作必须与对应字段的
aggregator
相匹配。Example
<field name="sent" sum="Total" /> <field name="clicks_ratio" avg="Average"/>
- Requirement
可选的
- 类型
- 默认
''
- width
列表视图始终尝试优化列之间的可用空间。对于某些字段类型,这是通过根据字段类型强制设置宽度来实现的。例如,我们确切知道显示日期所需的像素数,因此可以确保日期字段的列不会占用超过严格必要的空间,从而为其他列留下额外的空间。然而,框架无法为每种字段类型猜测合适的宽度。例如,字符字段可以用于编码大值或3字母的国家代码。在后一种情况下,可以直接在 arch 中设置宽度(例如
width="40px"
)。它表示渲染单元格内值所需的宽度(始终以像素为单位)。列的宽度将是给定值与单元格左右内边距的总和。- Requirement
可选的
- 类型
- 默认
''
- nolabel
字段的列标题是否应保持为空。如果设置,该列将不可排序。
它仅接受值
'1'
- Requirement
可选的
- 类型
- 默认
''
注解
当列表视图被分组时,数字字段会被汇总并显示在每个组中。此外,如果一个组中有太多记录,分页器会出现在组行的右侧。因此,在列表视图可能被分组的情况下,将数字字段放在最后一列是一种不好的做法。然而,对于表单视图中的X2many字段来说,这不会造成问题,因为它们不能被分组。
可能的渲染结构和表示
<list>
<field name="name" string="My Custom Name"/>
<field name="amount" sum="Total"/>
<field name="currency_id"/>
<field name="tax_id"/>
</list>
|
groupby
: define group headers¶
groupby
元素用于在通过 Many2one
字段对记录进行分组时,使用 button 元素定义组头。它还接受 field 元素,这些元素可用于修饰符。因此,这些字段属于 Many2one 协同模型。这些额外的字段是批量获取的。
<list>
...
<groupby name="FIELD_NAME">
<BUTTONS/>
<FIELDS/>
</groupby>
</list>
groupby
元素可以具有以下属性:
- name
用作标题的
Many2one
字段的名称。可以定义一个特殊的 button 元素,其
type="edit"
用于打开 Many2one 字段的表单视图。- Requirement
强制性的
- 类型
可能的渲染结构和表示
<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、filter、separator、group 和 searchpanel。
占位符以全大写字母表示。
field
: 基于字段值进行过滤¶
field
元素定义了带有用户提供值的域或上下文。当生成搜索域时,字段域会相互连接,并通过 AND 运算符与过滤器结合使用。
<search>
<field name="FIELD_NAME"/>
</search>
field
元素可以具有以下属性:
- name
用于筛选的字段名称。
- Requirement
强制性的
- 类型
- string
字段的标签。
- Requirement
可选的
- 类型
- 默认
模型字段的
string
属性
- operator
默认情况下,字段生成的域形式为
[(name, operator, value)]
,其中name
是字段的名称,value
是用户提供的值,可能经过过滤或转换(例如,用户应提供选择字段值的 标签,而不是值本身)。operator
属性允许覆盖默认的操作符,该操作符取决于字段的类型(例如,浮点数字段使用=
,字符字段使用ilike
,而 many2one 字段使用child_of
)。- Requirement
可选的
- 类型
- 默认
=
- filter_domain
用作字段搜索域的域,作为一个Python表达式,其计算结果为一个 domain。
It 可以使用
self
变量将提供的值注入自定义域中。与仅使用operator
属性相比,它可以用于生成显著更灵活的域(例如,同时搜索多个字段)。如果同时提供了
operator
和filter_domain
属性,filter_domain
优先。- Requirement
可选的
- 类型
- 默认
[]
- context
要合并到搜索视图所针对视图的上下文中的上下文,作为一个评估为字典的Python表达式。
它可以包含用户提供的值,这些值在
self
变量下可用。- Requirement
可选的
- 类型
- 默认
{}
- domain
应用于允许自动完成字段的完成结果的过滤器(例如,
Many2one
)。- Requirement
可选的
- 类型
- 默认
[]
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- 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>
- Requirement
可选的
- 类型
- 默认
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
过滤器的标签。
- Requirement
强制性的
- 类型
- help
悬停在过滤器上时显示的工具提示。
- Requirement
可选的
- 类型
- 默认
''
- domain
作为搜索域的一部分,附加到操作域的域。
- Requirement
可选的
- 类型
- 默认
[]
- 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>
请注意,以这种方式定义的所有自定义过滤器彼此之间以及与其他子过滤器之间是互斥的。
- Requirement
可选的
- 类型
- 默认
''
- start_month
日期过滤器下拉菜单中显示的最早月份,作为相对于当前月份的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" start_month="-3"/>
如果当前月份是二月,下拉菜单中可选的最早月份将是十一月。
- Requirement
可选的
- 类型
- 默认
-2
- Scope
具有非空
date
属性的过滤器
- end_month
日期过滤器下拉菜单中显示的最远月份,相对于当前月份的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" end_month="2"/>
如果当前月份是二月,下拉菜单中可选的最新月份将是三月。
- Requirement
可选的
- 类型
- 默认
0
- Scope
具有非空
date
属性的过滤器
- start_year
日期过滤器下拉菜单中显示的最早年份,作为相对于当前年份的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" start_year="-3"/>
如果当前年份是2024年,下拉菜单中可选择的最早年份将是2021年。
- Requirement
可选的
- 类型
- 默认
-2
- Scope
具有非空
date
属性的过滤器
- end_year
日期过滤器下拉菜单中显示的最新年份,作为相对于当前年的偏移量。
Example
<filter string="Creation Date" name="filter_create_date" date="create_date" end_year="2"/>
如果当前年份是2024年,下拉菜单中可选择的最新年份将是2025年。
- Requirement
可选的
- 类型
- 默认
0
- Scope
具有非空
date
属性的过滤器
- default_period
基于时间的过滤器(带有
date
属性)的默认周期。它必须是单个有效的过滤器 ID,或由逗号分隔的有效过滤器 ID 列表。有效的过滤器 ID 包括以下内容:
first_quarter
、second_quarter
、third_quarter
和fourth_quarter
。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>
- Requirement
可选的
- 类型
- 默认
month
,如果不可用则为最接近当前月份的值- Scope
具有非空
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>
- Requirement
可选的
- 类型
- 默认
False
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- context
上下文合并到操作的域中以生成搜索域
上下文键
group_by
设置为字段值可用于定义 Group By 菜单中可用的组。当字段类型为date
或datetime
时,过滤器会生成 Group By 菜单的子菜单,并提供以下间隔选项:Year、Quarter、Month、Week 和 Day。当过滤器在视图初始化时激活的默认过滤器集中时,默认情况下记录按月份分组。可以通过使用语法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
。- Requirement
可选的
- 类型
- 默认
{}
小心
过滤器序列(在没有非过滤器元素分隔的情况下)被视为包含性组合:它们将使用 OR
而不是通常的 AND
进行组合。
Example
<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>
state
字段为 draft
或 done
的记录将被显示。
Example
<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('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
元素用于在杂乱的搜索视图中分隔 过滤器 组。在较简单的搜索视图中,可以用 分隔符 元素替代。
<search>
<group expand="0" string="LABEL">
<FILTERS/>
</group>
</search>
group
元素不接受任何属性。
searchpanel
:显示搜索面板¶
searchpanel
元素在多记录视图的左侧显示一个搜索面板。它允许基于给定字段快速过滤数据。
<search>
<searchpanel>
<FIELDS/>
</searchpanel>
</search>
searchpanel
元素仅接受 field
子元素。
作为 searchpanel
元素的子元素使用的 field
元素可以具有以下属性:
- name
用于筛选的字段名称。
- Requirement
强制性的
- 类型
- string
字段的标签。
- Requirement
可选的
- 类型
- 默认
模型字段的
string
属性
- select
字段的行为和显示。它可以有两个不同的值:
- one
最多只能选择一个值。支持的字段类型为
many2one
和selection
。
- multi
可以选择多个值。支持的字段类型有
many2one
、many2many
和selection
。
- Requirement
可选的
- 类型
- 默认
one
- groups
以逗号分隔的用户组列表,元素将显示给这些用户组。不属于这些组中至少一个的用户将无法看到该元素。组名前可以加上负号
!
操作符以排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- Requirement
可选的
- 类型
- 默认
''
- icon
字段的图标。
- Requirement
可选的
- 类型
- 默认
''
- color
字段的颜色。
- Requirement
可选的
- 类型
- 默认
''
当 field
元素设置了 select=one
属性时,它可以具有以下附加属性:
当 field
元素设置了 select=multi
属性时,它可以具有以下附加属性:
- enable_counters
是否计算并在非零时显示记录计数器。
小技巧
此属性旨在避免影响性能。解决性能问题的另一种方法是重写
search_panel_select_range
和search_panel_select_multi_range
方法。- Requirement
可选的
- 类型
- 默认
False
- expand
是否应显示没有记录的类别和过滤器。
- Requirement
可选的
- 类型
- 默认
False
- limit
为该字段获取的最大值数量。如果达到限制,搜索面板上不会显示任何值,而是显示错误消息。如果设置为 0,则获取所有值。
- Requirement
可选的
- 类型
- 默认
200
- domain
记录必须满足的条件。
Example
<searchpanel> <field name="department_id"/> <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/> </searchpanel>
- Requirement
可选的
- 类型
- 默认
[]
搜索默认值¶
搜索字段和过滤器可以通过操作的 context
使用 search_default_name
键进行配置。对于字段,值必须是设置给字段的值。对于过滤器,它必须是一个布尔值或数字。
Example
使用 foo
作为字段,bar
作为过滤器,以下操作上下文将在 acro
上搜索 foo
并默认启用 bar
:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
可以使用一个介于1到99之间的数值来定义默认 groupby 过滤器的顺序。
Example
使用 foo
和 bar
这两个 groupby 过滤器时,以下操作上下文将首先启用 bar
,然后启用 foo
。
{
'search_default_foo': 2,
'search_default_bar': 1
}
看板¶
看板视图用作 看板 可视化:它们将记录显示为“卡片”,介于 列表 和 表单 视图之间。
记录可以按列分组,用于工作流可视化或操作(例如,任务或工作进度管理),也可以不分组(仅用于可视化记录)。
看板视图的根元素是 kanban
。
可能的渲染结构和表示
<kanban>
...
</kanban>
|
注解
看板视图最多加载并显示十列。之后的任何列默认关闭,但仍可由用户打开。
根属性¶
可选属性可以添加到根元素 kanban
上以自定义视图。
- create
禁用/启用视图上的记录创建。
- Requirement
可选的
- 类型
- 默认
True
- edit
禁用/启用视图上的记录编辑。
- Requirement
可选的
- 类型
- 默认
True
- delete
通过 操作 下拉菜单禁用/启用视图上的记录删除功能。
- Requirement
可选的
- 类型
- 默认
True
- default_order
一个以逗号分隔的字段名称列表,用于覆盖通过
_order
属性在模型上定义的排序。要反转字段的排序顺序,在其后加上
desc
,并用空格分隔。Example
<list default_order="sequence,name desc"> ... </list>
- Requirement
可选的
- 类型
- 默认
''
- class
向视图的根 HTML 元素添加 HTML 类。
- Requirement
可选的
- 类型
- 默认
''
- examples
KanbanExamplesRegistry
中的键,用于在分组看板视图中创建新列时可以浏览的示例。- Requirement
可选的
- 类型
- 默认
''
- group_create
是否显示 添加新列 栏。
- Requirement
可选的
- 类型
- 默认
True
- group_delete
是否可以通过齿轮菜单删除列。
- Requirement
可选的
- 类型
- 默认
True
- group_edit
是否可以通过齿轮菜单编辑列。
- Requirement
可选的
- 类型
- 默认
True
- groups_draggable
列是否可以重新排序。
- Requirement
可选的
- 类型
- 默认
True
- records_draggable
看板视图分组时,记录是否可拖动。
- Requirement
可选的
- 类型
- 默认
True
- archivable
当模型上定义了
active
字段时,属于某列的记录是否可以归档和取消归档。- Requirement
可选的
- 类型
- 默认
True
- quick_create
是否可以在不切换到表单视图的情况下创建记录。
- Requirement
可选的
- 类型
- 默认
当看板视图按 many2one、selection、char 或 boolean 字段分组时为
True
,否则为False
- on_create
点击 创建 时调用的自定义操作。
如果设置为
'quick_create'
,则使用快速创建记录。如果快速创建被禁用,则调用标准创建操作。- Requirement
可选的
- 类型
- 默认
''
- can_open
默认情况下,点击看板卡片会在表单视图中打开相应的记录。通过将属性
can_open
设置为False
可以禁用此行为。- Requirement
可选的
- 类型
- 默认
True
- highlight_color
用于为看板卡片左侧边框着色的整数字段名称。
- Requirement
可选的
- 类型
- sample
如果当前模型未找到任何记录,是否应使用一组示例记录填充视图。
这些假记录针对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而email
字段将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据进行交互,一旦执行了操作(记录创建、列添加等),这些数据将被丢弃。
- Requirement
可选的
- 类型
- 默认
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
要渲染的字段名称。
- Requirement
强制性的
- 类型
- widget
用于表示字段的小部件。所选的小部件可以改变字段的渲染方式和/或编辑方式。它指的是注册到
fields
注册表中的 Javascript 实现(一个 Owl 组件)。- Requirement
可选的
- 类型
默认情况下,字段节点会被替换为包含其格式化值的 span
,除非指定了 widget
属性,在这种情况下,它们的渲染和行为取决于相应的部件。 widget
属性可以有不同的值,包括:
- handle
允许通过拖放重新排序记录,使用相应字段作为顺序。
- kanban_color_picker
允许编辑颜色(整数)字段。与根属性
highlight_color
结合使用,可以编辑卡片的颜色。
请参阅 字段部分 以了解各种小部件及其选项。
渲染上下文¶
Kanban 模板通过 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 组件)。
参见 Widget 部分 以了解各种小部件及其选项。
布局¶
可以使用标准的 HTML 元素和 Bootstrap 工具类 轻松实现多种卡片布局。默认情况下,卡片是一个 flexbox 容器,其方向为 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
方向的 flexbox 容器,允许在同一行上轻松显示多个字段。
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
类名。main
节点是一个 flexbox 容器,就像没有 aside
时的卡片一样。
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
元素也可以在 kanban templates 之外 使用。在这种情况下,它允许声明那些不在卡片中显示但仍需要获取的字段,例如因为它们的值在 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
进度条子组所基于的字段名称。
- Requirement
强制性的
- 类型
- colors
进度条字段值到颜色值
muted
、success
、warning
和danger
的映射。- Requirement
强制性的
- 类型
- sum_field
用于在进度条旁边显示总和的字段名称。如果未设置,则显示记录的总数。
- Requirement
可选的
- 类型
- 默认
''
可能的渲染结构和表示
<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视图(在操作内打开),在这种情况下,它们应该被定义为具有显式
类型
(它不能被推断)和模型的常规视图。
qweb-as-view 相对于基本的 qweb-as-template 的主要增强功能包括:
qweb-as-view 对于带有 CSS 类
o_qweb_cp_buttons
的<nav>
元素有一个特殊情况:其内容应为按钮,并将被提取并移动到控制面板的按钮区域,<nav>
本身将被移除,这是针对控制面板视图尚未存在的一种变通方法qweb-as-view 渲染会在标准 qweb 渲染上下文中添加几个项目:
model
绑定到 qweb 视图的模型
domain
搜索视图提供的域
context
搜索视图提供的上下文
records
一个对
model.search(domain)
的延迟代理,如果你只想遍历记录而不执行更复杂的操作(例如分组),可以使用它
qweb-as-view 还提供了额外的渲染钩子:
_qweb_prepare_context(view_id, domain)
prepares the rendering context specific to qweb-as-viewqweb_render_view(view_id, domain)
是客户端调用的方法,将调用上下文准备方法,最终调用env['ir.qweb'].render()
。
图表¶
图表视图用于可视化一组记录或记录组的聚合。其根元素为 <graph>
,可以使用以下属性:
type
(optional)one of
bar
(default),pie
andline
, the type of graph to usestacked
(optional)仅用于
bar
图表。设置为0
以防止组内的柱形图最初被堆叠。disable_linking
(optional)将其设置为
1
以防止将图表上的点击重定向到列表视图order
(optional)如果设置,x轴值将默认根据其测量值按给定顺序(
asc
或desc
)排序。仅用于bar
和pie
图表。string
(optional)重定向到列表视图时在面包屑中显示的字符串。
- sample
如果当前模型未找到任何记录,是否应使用一组示例记录填充视图。
这些假记录针对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而email
字段将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据进行交互,一旦执行了操作(记录创建、列添加等),这些数据将被丢弃。
- Requirement
可选的
- 类型
- 默认
False
图表视图中唯一允许的元素是 field
,它可以具有以下属性:
name
(mandatory)视图中要使用的字段名称。如果用于分组(而不是聚合),请使用此字段。
invisible
(optional)如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中。
type
(optional)如果设置为
measure
,该字段将被用作分组内的聚合值,而不是分组条件。它仅适用于具有该属性的最后一个字段,但对于具有字符串属性的其他字段也很有用(见下文)。interval
(optional)在日期和日期时间字段上,按指定的间隔(
day
、week
、month
、quarter
或year
)进行分组,而不是按特定的日期时间(固定到秒的精度)或日期(固定到天的精度)进行分组。默认值为month
。string
(optional)仅用于具有
type="measure"
的字段。在图表视图中显示字段的名称,覆盖字段的默认 Python 字符串属性。
度量值是从模型字段自动生成的;只使用可聚合字段。这些度量值也按字段字符串的字母顺序排序。
警告
图形视图聚合是在数据库内容上执行的,非存储函数字段不能在图形视图中使用。
在图形视图中,一个 field
可以有一个 widget
属性来指定其格式。该 widget 应该是一个字段格式化器,其中最有趣的是 float_time
和 monetary
。
<field name="working_hours_close" widget="float_time"/>
透视表¶
透视视图用于将聚合可视化为 透视表。其根元素是 <pivot>
,可以使用以下属性:
disable_linking
(optional)将其设置为
1
以删除表格单元格与列表视图的链接。display_quantity
(optional)将其设置为
1
以默认显示数量列。default_order
(optional)在视图中使用的默认顺序(升序或降序)的度量名称。
<pivot default_order="foo asc"> <field name="foo" type="measure"/> </pivot>
在透视图中,唯一允许的元素是 field
,它可以具有以下属性:
name
(mandatory)视图中要使用的字段名称。如果用于分组(而不是聚合),请使用此字段。
string
(optional)将用于在数据透视表视图中显示字段的名称,覆盖字段的默认 Python 字符串属性。
type
(optional)指示该字段应该作为分组标准还是在组内作为聚合值使用。可能的值为:
row
(default)按指定字段分组,每个组都有自己的行。
col
创建列分组
measure
在分组内聚合的字段
interval
在日期和日期时间字段上,按指定的间隔(
day
、week
、month
、quarter
或year
)进行分组,而不是按特定的日期时间(固定到秒的精度)或日期(固定到天的精度)进行分组。
invisible
(optional)如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中(对于不适合聚合的字段非常有用,例如不同单位的字段,例如 € 和 $)。
- sample
如果当前模型未找到任何记录,是否应使用一组示例记录填充视图。
这些假记录针对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而email
字段将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据进行交互,一旦执行了操作(记录创建、列添加等),这些数据将被丢弃。
- Requirement
可选的
- 类型
- 默认
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>
。日历视图上可用的属性有:
- 字符串
string (default:
''
)此视图标题仅在您打开一个没有名称且目标为 ‘new’(打开对话框)的操作时显示
- 创建
bool (default:
True
)禁用/启用视图上的记录创建。
- 编辑
bool (default:
True
)禁用/启用视图上的记录编辑。
- 删除
bool (default:
True
)通过 操作 下拉菜单禁用/启用视图上的记录删除。
date_start
(required)记录中保存事件开始日期的字段名称
date_stop
如果提供了
date_stop
,则记录的字段名称将包含事件的结束日期,记录将可以通过拖放直接在日历中移动date_delay
替代
date_stop
,提供事件的持续时间而不是其结束日期(单位:天)color
用于 颜色分段 的记录字段名称。在日历中,同一颜色分段的记录被分配相同的高亮颜色,颜色被半随机分配。在侧边栏中显示可见记录的display_name/avatar
form_view_id
在用户创建或编辑事件时打开的视图。请注意,如果未设置此属性,则日历视图将回退到当前操作中表单视图的ID(如果有)。
event_open_popup
如果选项 ‘event_open_popup’ 设置为 true,则日历视图将在 FormViewDialog 中打开事件(或记录)。否则,它将在新的表单视图中打开事件(使用 do_action)。
quick_create
在点击时启用快速事件创建:只要求用户提供
name``(可以通过 ``rec_name
控制保存该值的字段),然后尝试仅使用该值和点击的事件时间创建新事件。如果快速创建失败,则回退到完整的表单对话框quick_create_view_id
当设置了属性
quick_create
并且用户创建事件而不是默认对话框时打开的视图。create_name_field
记录的字段名称,保存记录的文本表示形式,用于通过“快速创建”机制创建记录时使用
all_day
记录中一个布尔字段的名称,指示相应的事件是否被标记为全天事件(持续时间无关紧要)
mode
加载日历时的默认显示模式。可能的属性有:
day
,week
,month
,year
scales
提供的比例尺的逗号分隔列表。默认情况下,所有比例尺都可用。有关可能的比例尺值,请参见模式。
create
,delete
允许通过将相应的属性设置为
false
来在视图中禁用相应的操作<field>
声明要聚合或在看板 逻辑 中使用的字段。如果字段仅在日历卡片中显示。
字段可以有额外的属性:
invisible
在卡片中隐藏该值,请使用“True”
avatar_field
仅适用于x2many字段,在卡片中显示头像而不是显示名称
write_model
和write_field
和filter_field
您可以添加筛选器并将结果保存在定义的模型中,筛选器将添加在侧边栏中。
filter_field
是可选的,允许您指定将保存筛选器状态的字段。filters
和color
使用”True”将此字段添加到侧边栏的筛选器中。您可以指定一个
color
字段用于给复选框上色。
通用模型¶
- Model._date_name = 'date'
field to use for default calendar view
活动¶
活动视图用于显示与记录相关的活动。数据以图表形式展示,记录构成行,活动类型构成列。每行的第一个单元格显示一个(可自定义,参见 templates
,与 看板 非常相似)卡片,代表相应的记录。点击其他单元格时,会显示该记录同类型所有活动的详细描述。
警告
只有在安装了 mail
模块并且继承自 mail.activity.mixin
的模型中,才能使用活动视图。
活动视图的根元素是 <activity>
,它接受以下属性:
string
(mandatory)一个描述视图的标题
视图元素的可能子元素有:
field
声明在活动 逻辑 中使用的字段。如果字段仅在活动视图中显示,不需要预先声明。
可能的属性有:
name
(required)要获取的字段的名称
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视图的根元素是<cohort>,它接受以下属性:
string
(mandatory)一个描述视图的标题
date_start
(mandatory)一个有效的日期或日期时间字段。该字段被视图理解为记录的开始日期。
date_stop
(mandatory)一个有效的日期或日期时间字段。该字段被视图理解为记录的结束日期。这是确定流失的字段。
disable_linking
(optional)设置为
1
以防止将队列单元格的点击重定向到列表视图。mode
(optional)一个描述模式的字符串。它应该是’churn’或’retention’(默认)。Churn模式将从0%开始随着时间的推移而累积,而retention模式将从100%开始随着时间的推移而减少。
timeline
(optional)一个描述时间轴的字符串。它应该是’backward’或’forward’(默认)。前向时间轴将显示从date_start到date_stop的数据,而后向时间轴将显示从date_stop到date_start的数据(当date_start在未来/大于date_stop时)。
interval
(optional)描述时间间隔的字符串。它应该是 ‘day’,’week’,’month’(默认)或 ‘year’。
measure
(optional)可聚合的字段。该字段将用于计算每个单元格的值。如果未设置,则队列视图将计算出现次数。
<field>
(optional)允许指定特定字段以便从可用的度量中进行管理,其主要用途是隐藏可选度量中的字段:
name
(mandatory)在视图中使用的字段名称。
string
(optional)将在队列视图中显示该字段的名称,覆盖字段的默认 Python 字符串属性。
invisible
(optional)如果为真,该字段将不会出现在活动度量或可选度量中(适用于不适合聚合的字段,例如不同单位的字段,如€和$)。如果值是一个域,则根据当前行记录的上下文评估该域,如果为
True
,则相应的属性将设置在单元格上。widget
(optional)字段显示的替代表示形式。
- odoo.addons.base.models.ir_ui_view.sample
如果当前模型未找到任何记录,是否应使用一组示例记录填充视图。
这些假记录针对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而email
字段将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据进行交互,一旦执行了操作(记录创建、列添加等),这些数据将被丢弃。
- Requirement
可选的
- 类型
- 默认
False
表格¶
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)
可选的
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)列分组字段。
col字段可以包含0个或多个
<range>
元素,用于指定可自定义的列范围。range
元素具有以下强制属性name
可以通过
grid_range
上下文值来覆盖默认范围(默认情况下为第一个)string
范围按钮的标签(用户可见)
span
在视图中一次显示的所有列的跨度的符号名称,可能会触发分页。
对于
date
字段,有效的时间跨度目前有week
和month
。step
前一列和后一列之间的步骤的符号名称
对于
date
字段,目前唯一有效的跨度是day
。
<field type="measure">
(1)单元格字段,自动累计(通过
read_group
)。测量字段可以使用
widget
属性来自定义其显示。
服务器交互¶
除了可选按钮外,网格视图目前调用两个方法:
read_grid
(provided on all models by the module) returns almost the entirety of the grid’s content as a dict:行标题是一个带有以下键的字典列表:
values
(required)这映射到一个字典,每个
row
字段对应一个键,其值 始终 为[value, label]
的形式。domain
(required)在单元格调整期间需要复制记录时,此行源记录的域
列标题是一个至少包含一个键的字典列表:
values
(required)查看行标题值
domain
(required)查看列域值
current
(optional)布尔值,标记/突出显示一列
将网格数据作为单元格字典的列表(行的列表)的列表返回,每个单元格字典都具有以下键:
value
与单元格相关联的数值
domain
匹配单元格记录的域(应被视为不透明)
size
单元格中分组的记录数
readonly
(optional)一个布尔值,指示此特定单元格不应该在客户端进行编辑
classes
(optional)一个字符串列表,包含要添加到单元格容器中(在单元格的 TD 和可编辑元素之间)的类。
在这个列表和基类(以
o_grid_cell_
为前缀)之间发生冲突时,将忽略此列表中的类。
请注意,网格数据是 密集的 ,如果查询数据库时没有匹配到任何组与单元格匹配,则会生成一个带有默认值的”空”单元格,以满足必需键。
prev
和next
可以是 falsy(无分页)或者是一个上下文项,用于合并到视图自身的上下文中,以便于read_grid
读取上一页或下一页,应该假设它是不透明的
read_grid_domain(field, range)``(由模块在所有模型上提供)返回与当前配置的网格“范围”匹配的域。这也是 ``read_grid
在内部完成的,但在某些情况下,独立调用它可能有用或必要,以便与单独的例如search_count
或read_group
一起使用。adjust_grid
, for which there currently isn’t a blanket implementation and whose semantics are likely to evolve with time and use cases
服务器钩子¶
read_grid
calls a number of hooks allowing the customisation of its
operations from within without having to override the entire method:
_grid_format_cell(group, cell_field)
将 read_group(按组分组)的输出转换为上述格式的单元格(作为“网格数据”的一部分)
_grid_make_empty_cell(row_domain, column_domain, view_domain)
生成一个空的单元格版本(如果没有相应的组)
_grid_column_info(name, range)
基于列类型生成 ColumnMetadata 对象,存储值,可以直接返回(作为
read_grid
的一部分)或用于查询和将read_group
重新格式化为read_grid
:grouping
用于列的实际分组字段/查询
domain
如果列字段进行分页,则在
read_group
中应用的域,可以是空列表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 视图的根元素是 <gantt/>
,它没有子元素,但可以使用以下属性:
- 字符串
string (default:
''
)此视图标题仅在您打开一个没有名称且目标为 ‘new’(打开对话框)的操作时显示
- 创建
bool (default:
True
)禁用/启用视图上的记录创建。
- 编辑
bool (default:
True
)禁用/启用视图上的记录编辑。
- 删除
bool (default:
True
)通过 操作 下拉菜单禁用/启用视图上的记录删除。
date_start
(required)每条记录提供事件开始日期时间的字段名称。
date_stop
(required)为每个记录提供事件结束时间的字段名称。
dependency_field
提供两个记录之间依赖关系的
many2many
字段的名称。如果B依赖于A,则dependency_field
是允许从B获取A的字段。这个字段和dependency_inverted_field
字段都用于绘制依赖箭头,以便调整它们的时间表。dependency_inverted_field
(如果提供了dependency_field
则为必填项)提供反向依赖关系的
many2many
字段的名称比dependency_field
更倾向于。如果B依赖于A,dependency_inverted_field
是允许从A获取B的字段。color
用于根据其值着色药丸的字段名称
decoration-{$name}
python 表达式 其计算结果为布尔值
允许根据相应记录的属性更改单元格文本的样式。
{$name}
可以是以下 bootstrap contextual color (danger
,info
,secondary
,success
或warning
)。根据相应记录的属性,定义类似于行文本的记录的条件显示。
值是Python表达式。对于每个记录,表达式将使用记录的属性作为上下文值进行评估,如果为
true
,则将应用相应的样式到行中。以下是上下文中其他可用的值:uid
: the id of the current user,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
: If enabled, the opened records will be in edit mode (thus editable).plan
:如果启用且edit
也启用,时间槽上将显示一个“放大镜”按钮,用于将未分配的记录计划到该时间槽中。
Example
当您不想在甘特视图上创建记录,并且模型需要开始和结束日期时,应禁用计划功能,因为永远找不到记录。
offset
根据规模,添加到今天以计算默认周期的单位数。例如:在默认规模为周的情况下,偏移量为+1将打开下周的甘特图视图,在默认规模为月的情况下,偏移量为-2将打开2个月前的甘特图视图。
progress
记录事件完成百分比的字段名称,介于0和100之间
string
甘特图视图的标题
precision
JSON 对象,指定每个刻度中药丸的捕捉精度。
可用的刻度值为
day
(默认值:hour
):hour
: records times snap to full hours (ex: 7:12 becomes 8:00)hour:half
: records times snap to half hours (ex: 7:12 becomes 7:30)hour:quarter
: records times snap to half hours (ex: 7:12 becomes 7:15)
Possible values for scale
week
are (default:day:half
):day
: records times snap to full days (ex: 7:28 AM becomes 11:59:59 PM of the previous day, 10:32 PM becomes 12:00 PM of the current day)day:half
: records times snap to half hours (ex: 7:28 AM becomes 12:00 PM)
可用的刻度值为
month
(默认值:day:half
):day
: records times snap to full days (ex: 7:28 AM becomes 11:59:59 PM of the previous day, 10:32 PM becomes 12:00 PM of the current day)day:half
: records times snap to half hours (ex: 7:28 AM becomes 12:00 PM)
Scale
year
always snap to full day.精度属性的示例:
{"day": "hour:quarter", "week": "day:half", "month": "day"}
total_row
布尔值,用于控制是否显示包含记录总数的行。(默认值:
false
)- ``collapse_first_level`
布尔值,用于控制是否可以折叠每一行,如果按一个字段分组。(默认值:
false
,当按两个字段分组时开始折叠)display_unavailability
boolean 用于标记模型的
gantt_unavailability
函数返回的日期在甘特图视图中是否可用。记录仍然可以在其中安排,但它们的不可用性会在视觉上显示出来。(默认值:false
)`default_scale`
渲染视图时的默认比例。可能的值为(默认值:
month
):day
week
month
year
scales
逗号分隔的允许此视图的比例列表。默认情况下,允许所有比例。要在此列表中使用的可能比例值,请参见
default_scale
。templates
定义了 QWeb模板 模板
gantt-popover
,当用户悬停在甘特图视图中的记录之一时使用。gantt视图主要使用标准的 javascript qweb 并提供以下上下文变量:
widget
当前的
GanttRow()
可用于获取一些元信息。getColor
方法用于将颜色转换为整数,也可以直接在模板上下文中使用,而无需使用widget
。on_create
如果在视图上点击添加按钮时指定了此参数,则不会打开通用对话框,而是启动一个客户端操作。此参数应该包含操作的xmlid(例如:
on_create="%(my_module.my_wizard)d"
form_view_id
在用户创建或编辑记录时打开的视图。请注意,如果未设置此属性,则甘特图视图将回退到当前操作中表单视图的ID(如果有)。
dynamic_range
如果设置为 true,则甘特图视图将从第一条记录开始,而不是从年/月/日的开始处开始。
pill_label
如果设置为true,则在将刻度设置为周或月时,时间将显示在药丸标签中。 (例如
7:00 AM - 11:00 AM (4h) - DST Task 1
)thumbnails
如果组是关系字段,这将允许在组名旁边显示缩略图。这需要一个Python字典,其键是活动模型上字段的名称。值是相关模型上持有缩略图的字段的名称。
例如:任务有一个字段 user_id,它引用了 res.users。res.users 模型有一个字段 image,它保存了头像,那么:
<gantt date_start="date_start" date_stop="date_stop" thumbnails="{'user_id': 'image_128'}" > </gantt>
将按用户ID分组时,显示用户头像在其名称旁边。
- odoo.addons.base.models.ir_ui_view.sample
如果当前模型未找到任何记录,是否应使用一组示例记录填充视图。
这些假记录针对某些字段名称/模型具有启发式规则。例如,模型
res.users
上的字段display_name
将填充示例人名,而email
字段将采用firstname.lastname@sample.demo
的形式。用户无法与这些数据进行交互,一旦执行了操作(记录创建、列添加等),这些数据将被丢弃。
- Requirement
可选的
- 类型
- 默认
False
地图¶
Enterprise feature此视图能够在地图上显示记录和它们之间的路线。记录由图钉表示。它还允许在与记录图钉相关联的弹出窗口中可视化模型中的字段。
注解
应用视图的模型应该包含一个 res.partner
many2one,因为视图依赖于 res.partner
的地址和坐标字段来定位记录。
API¶
视图使用位置数据平台的API来获取瓦片(地图的背景),进行地理转发(将地址转换为一组坐标)和获取路线。视图实现了两个API,OpenStreetMap和MapBox。默认情况下使用OpenStreetMap,能够获取 瓦片 和进行 地理转发。该API不需要令牌。只要在常规设置中提供了有效的 MapBox 令牌,视图就会切换到MapBox API。该API更快,并允许计算路线。可以通过 注册 MapBox 来获取令牌。
结构组件¶
视图的根元素是 <map>
。它可以具有以下属性:
res_partner
包含
res.partner
的 many2one 字段。如果未提供,则视图将创建一个空地图。default_order
如果提供了字段,则视图将覆盖模型的默认排序。字段必须是应用视图的模型的一部分,而不是来自
res.partner
。routing
如果为
1
,则显示记录之间的路线。视图需要有效的 MapBox 令牌和至少两个已定位的记录(即记录具有res.partner
many2one 并且合作伙伴具有地址或有效坐标)。hide_name
如果
1
隐藏名称在弹出窗口的针(默认:0
)。hide_address
如果
1
隐藏地址从弹出窗口的图钉 (默认:0
)。hide_title
如果
1
从固定列表中隐藏标题(默认值:0
)。panel_title
在固定列表中显示的标题字符串。如果未提供,则标题为操作的名称或如果视图不在操作中,则为“Items”。
limit
要获取的最大记录数(默认值:
80
)。它必须是一个正整数。
The <map>
element can contain multiple <field>
elements. Each <field>
element is interpreted as a line in the pin’s popup. The field’s attributes are the following:
name
要显示的字段。
string
字段内容前要显示的字符串。它可以用作描述。
- 例如,这里是一张地图:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1"> <field name="partner_id" string="Customer Name"/> </map>