视图架构¶
通用架构¶
视图的架构由 JavaScript 框架解释的 XML 数据定义。
对于大多数视图,有一个 *.rng
文件用于定义属性和可能的架构。某些视图不受此类文件限制,要么是因为它们接受 HTML 内容,要么是出于性能考虑。
注解
当前上下文和用户访问权限可能会影响视图的可用性。
另请参见
查看记录
Python 表达式¶
在评估节点属性时,例如 readonly
修饰符,可以提供一个 Python 表达式,该表达式将在一个可访问以下变量的环境中执行:
当前视图中所有字段的名称,包含当前记录的值,但不包括 列表视图 中的
column_invisible
;关系型字段以ID列表的形式给出;当前记录的 ID;
parent
: 指引用容器的记录;仅在 关系字段 的子视图中使用;context (字典)
: 当前视图的上下文;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
添加可选属性以自定义视图。
- string
视图标题。仅在打开一个没有名称且目标为 `new`(打开对话框)的动作时显示。
- 要求
可选
- 类型
字符串
- 默认
''
- create
禁用/启用视图中的记录创建。
- 要求
可选
- 类型
布尔值
- 默认
True
- edit
禁用/启用视图中的记录编辑。
- 要求
可选
- 类型
布尔值
- 默认
True
- duplicate
通过视图中的 动作 下拉菜单禁用/启用记录复制。
- 要求
可选
- 类型
布尔值
- 默认
True
- delete
通过视图中的 动作 下拉菜单禁用/启用记录删除。
- 要求
可选
- 类型
布尔值
- 默认
True
- js_class
Web客户端将实例化的JavaScript组件名称,而不是表单视图。
- 要求
可选
- 类型
字符串
- 默认
''
- disable_autofocus
禁用视图中第一个字段的自动聚焦。
- 要求
可选
- 类型
布尔值
- 默认
False
语义组件¶
语义组件与 Odoo 系统相关联,并允许与其进行交互。
表单视图接受以下子语义组件:字段、标签、按钮、引用 和 附件。
占位符以全大写字母表示。
字段
: 显示字段值¶
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
字段为空时显示的帮助消息。它可以在复杂表单中替代字段标签。然而,它**不应**是数据示例,因为用户可能会将占位符文本与已填写的字段混淆。
- 要求
可选
- 类型
字符串
- 默认
''
- 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
字段
- password
是否该字段存储密码,因此其数据不应显示。
- 要求
可选
- 类型
布尔值
- 默认
False
- 作用域
Char
字段
- 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
聊天小部件¶
该 chatter widget 是用于沟通和记录的工具,允许从一条记录(任务、订单、发票、活动、笔记等)直接向同事和客户发送邮件。
当模型继承 mail.thread
混入类时,会通过 div
元素添加 oe_chatter
类。
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
元素不应放置在 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>
应用
元素可以具有以下属性:
- string
应用的名称。
- 要求
必填
- 类型
字符串
- name
应用的技术名称(模块的名称)。
- 要求
必填
- 类型
字符串
- logo
该 Logo 的 相对路径。
- 要求
可选
- 类型
路径
- 默认
通过
name
属性计算的路径:/name/static/description/icon.png
- groups
元素显示给的用户组的逗号分隔列表。如果不属于这些组中的至少一个,用户将无法看到该元素。可以通过在组前添加否定
!
运算符来排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
- 类型
字符串
- 默认
''
- invisible
元素是否可见(
False
)或隐藏(True
),作为一个评估为布尔值的 Python 表达式。注解
invisible
属性有两种用途:可用性:为了避免视图过于复杂,并使用户更容易阅读,具体取决于内容。
技术:要在 Python 表达式中使用的字段,必须在视图中存在(仅设置为不可见即可)。
Example
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
- 类型
- 默认
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
元素用于声明设置本身。
设置中的第一个 字段 元素用作主字段。如果该字段是布尔类型,则放置在左侧面板;否则,放置在右侧面板的顶部。如果未定义 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
设置文档的 path。如果设置,会在设置标签旁边显示一个可点击的图标。路径可以是绝对路径,也可以是 relative path。在后一种情况下,它相对于
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
用于列表视图,40
用于表单视图中的 X2many 列表
- groups_limit
当列表视图按组分页时,每页的默认组数。必须为严格正数。
- 要求
可选
- 类型
- 默认
80
用于列表视图,40
用于表单视图中的 X2many 列表
- expand
是否在列表视图按组分组时,默认展开第一层分组。
警告
这可能会比较慢,具体取决于分组的数量。
- 要求
可选
- 类型
布尔值
- 默认
False
- sample
如果当前模型未找到任何记录,视图是否应使用一组示例记录进行填充。
这些假数据记录对某些字段名称/模型有启发式处理。例如,在模型
res.users
上的字段display_name
会填充示例人员姓名,而email
字段则会采用firstname.lastname@sample.demo
的格式。用户无法与这些数据进行交互,一旦执行任何操作(如创建记录、添加列等),这些数据将被立即丢弃。
- 要求
可选
- 类型
布尔值
- 默认
False
组件¶
列表视图接受以下子元素:字段、按钮、按…分组、表头、控制和创建。
占位符以全大写字母表示。
字段
: 显示字段值¶
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
字段的列标题是否应保持为空。如果设置为 true,该列将不可排序。
它仅接受值
'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
元素用于创建可切换的预定义筛选器,这些筛选器可以在搜索视图中使用。它允许向搜索上下文 传递给数据视图用于搜索/筛选的上下文 添加数据,或者在搜索筛选器中追加新的部分。
<search>
<filter string="LABEL" domain="DOMAIN"/>
</search>
filter
元素可以具有以下属性:
- string
筛选器的标签。
- 要求
必填
- 类型
字符串
- help
悬停在筛选器上时显示的提示信息。
- 要求
可选
- 类型
字符串
- 默认
''
- domain
要附加到动作的领域以作为搜索领域的部分的领域。
- 要求
可选
- 类型
- 默认
[]
- date
要筛选的
date
或datetime
字段的名称。当使用此属性时,它会在 过滤器 菜单的子菜单中创建一组可用的筛选条件。可用的筛选条件是基于时间的,但并非动态的,因为它们的域(domain)是在控制面板实例化时进行评估的。
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 列表。有效的筛选器 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>
- 要求
可选
- 类型
字符串
- 默认
月份
,如果不可用,则为最接近当前月份的值- 作用域
带有非空
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)]"/>
状态字段为草稿且延迟字段低于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
元素用于在简单搜索视图中分隔 筛选器 的组。对于更复杂的搜索视图,建议使用 用户组 元素。
<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
要筛选的字段名称。
- 要求
必填
- 类型
字符串
- string
字段的标签。
- 要求
可选
- 类型
字符串
- 默认
模型字段的
string
属性
- select
字段的行为和显示方式。它可以有以下两种不同的值:
- one
最多只能选择一个值。支持的字段类型为
many2one
和selection
。
- multi
可以选择多个值。支持的字段类型包括
many2one
、many2many
和selection
。
- 要求
可选
- 类型
字符串
- 默认
一个
- groups
元素显示给的用户组的逗号分隔列表。如果不属于这些组中的至少一个,用户将无法看到该元素。可以通过在组前添加否定
!
运算符来排除这些组。Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
- 类型
字符串
- 默认
''
- icon
字段的图标。
- 要求
可选
- 类型
字符串
- 默认
''
- color
字段的颜色。
- 要求
可选
- 类型
字符串
- 默认
''
当 field
元素设置 select=one
属性时,它可以具有以下附加属性:
- hierarchize
是否应将子类别显示在其父类别下,还是在同一层级显示。
- 要求
可选
- 类型
布尔值
- 默认
True
- 作用域
Many2one
字段
当 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
使用 foo
和 bar
两个 groupby 过滤器,以下动作上下文将首先启用 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
一个包含两个键的对象,用于定义用户可用的操作:
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
包含
parse
方法的 JavaScript JSON 命名空间对象,用于将 JSON 字段值解析为 JavaScript 对象。
小部件¶
widget
元素允许在卡片中插入通过 JavaScript 动态生成的 HTML。它具有一个必需的 name
属性,该属性引用已注册到 view_widgets
注册表中的 JavaScript 实现(一个 Owl 组件)。
查看 小部件部分 以了解各种小部件及其选项。
布局¶
可以使用标准的 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
方向的弹性容器,以便于在同一行上轻松显示多个字段。
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
节点是一个类似于卡片的弹性盒子容器,当没有 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
元素也可以在看板 模板 之外 使用。在这种情况下,它可以用来声明那些不在卡片中显示的字段,但仍需要获取,例如因为它们的值被用在 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
元素用于在分组看板视图中的看板列上方定义一个进度条。
<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 视图有两种使用场景:
它们可以用作前端模板,在这种情况下,应使用 模板 作为快捷方式。
它们可以用作实际的 QWeb 视图(在动作中打开),在这种情况下,应将它们定义为具有显式 ``type``(不能推断)和模型的常规视图。
qweb-as-view 对基本 qweb-as-template 的主要扩展包括:
qweb-as-view 对带有 CSS 类
o_qweb_cp_buttons
的<nav>
元素有特殊处理:其内容应为按钮,并将被提取并移动到控制面板的按钮区域,<nav>
本身将被删除。这是为了解决控制面板视图尚未存在时的临时解决方案。qweb-as-view 渲染会向标准 qweb 渲染上下文中添加若干项:
模型
绑定到此 qweb 视图的模型
域
由搜索视图提供的领域
上下文
由搜索视图提供的上下文
记录
一个对
model.search(domain)
的惰性代理,如果您只需要遍历记录而不需要执行更复杂的操作(例如分组)时可以使用它。
qweb-as-view 还提供了额外的渲染钩子:
_qweb_prepare_context(view_id, domain)
为 qweb 作为视图的渲染上下文做准备qweb_render_view(view_id, domain)
是客户端调用的方法,它将调用上下文准备方法,并最终调用env['ir.qweb'].render()
。
图表¶
图表视图用于可视化多个记录或记录组的聚合数据。其根元素是 <graph>
,它可以包含以下属性:
- ``类型``(可选)
其中一个是
bar``(默认)、``pie
和line
,用于指定要使用的图表类型堆叠
(可选)仅用于
bar
图表。设置为0
以防止用户组内的条形图初始时堆叠。disable_linking
(可选)设置为
1
以防止点击图表时重定向到列表视图订单
(可选)如果设置,x轴值将根据给定顺序(
asc
或desc
)按其度量值默认排序。仅用于bar
和pie
图表。字符串
(可选)当重定向到列表视图时,在面包屑导航中显示的字符串。
- sample
如果当前模型未找到任何记录,视图是否应使用一组示例记录进行填充。
这些假数据记录对某些字段名称/模型有启发式处理。例如,在模型
res.users
上的字段display_name
会填充示例人员姓名,而email
字段则会采用firstname.lastname@sample.demo
的格式。用户无法与这些数据进行交互,一旦执行任何操作(如创建记录、添加列等),这些数据将被立即丢弃。
- 要求
可选
- 类型
布尔值
- 默认
False
图表视图中唯一允许的元素是 field
,它可以具有以下属性:
名称
(必填)视图中要使用的字段名称。如果用于分组(而非聚合)
invisible
(可选)如果为真,该字段将既不会出现在激活的度量中,也不会出现在可选择的度量中。
- ``类型``(可选)
如果设置为
measure
,该字段将在分组中用作聚合值,而不是分组条件。它仅对具有该属性的最后一个字段有效,但对于其他具有字符串属性的字段(见下文)很有用。interval
(可选)对于日期和日期时间字段,按指定的间隔(
day
、week
、month
、quarter
或year
)进行分组,而不是按具体的日期时间(固定秒级精度)或日期(固定天级精度)进行分组。默认值为month
。字符串
(可选)仅用于字段类型为
type="measure"
的情况。该名称将用于在图表视图中显示该字段,会覆盖字段的默认 Python 字符串属性。
这些度量值是根据模型字段自动生成的;仅使用可聚合的字段。这些度量值还会根据字段的字符串进行字母顺序排序。
警告
图表视图的聚合是在数据库内容上执行的,非存储的函数字段不能在图表视图中使用。
在图表视图中,一个 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
,它可以具有以下属性:
名称
(必填)视图中要使用的字段名称。如果用于分组(而非聚合)
字符串
(可选)该字段在透视表中显示的名称,将覆盖字段的默认 Python 字符串属性。
- ``类型``(可选)
表示该字段是否应作为分组依据,或在组内作为聚合值使用。可能的取值为:
行
(默认)按指定字段分组,每个组都会有自己的行。
列
创建按列分组
测量
组内要聚合的字段
间隔
对于日期和日期时间字段,按指定的间隔(
day
、week
、month
、quarter
或year
)进行分组,而不是按具体的日期时间(固定秒级精度)或日期(固定天级精度)进行分组。
invisible
(可选)如果为真,该字段将既不会出现在“激活指标”中,也不会出现在“可选指标”中(对于无法进行聚合的字段很有用,例如单位不同的字段,如 € 和 $)。
- 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”(打开对话框),则会显示此视图标题。
- 创建
bool(默认:
True
)禁用/启用视图中的记录创建。
- 编辑
bool(默认:
True
)禁用/启用视图中的记录编辑。
- 删除
bool(默认:
True
)通过 动作 下拉菜单禁用/启用视图中的记录删除。
date_start
(必填)记录中保存事件开始日期的字段名称
日期结束
记录中保存事件结束日期的字段名称,如果提供了
date_stop
,则记录可以在日历中直接通过拖放操作进行移动日期延迟
替代
date_stop
,提供事件的持续时间而非结束日期(单位:天)颜色
用于*颜色分段*的记录字段名称。同一颜色分段中的记录在日历中会分配相同的高亮颜色,颜色是半随机分配的。在侧边栏中显示可见记录的 display_name/avatar。
表单视图ID
当用户创建或编辑事件时打开的视图。请注意,如果未设置此属性,日历视图将回退到当前动作中的表单视图的 ID(如果有的话)。
打开弹窗
如果选项 ‘event_open_popup’ 设置为 true,则日历视图会以表单视图对话框(FormViewDialog)打开事件(或记录)。否则,它会以新的表单视图打开事件(通过 do_action 实现)。
快速创建
启用点击快速创建事件:仅向用户请求一个
name``(此值保存到的字段可通过 ``rec_name
控制),并尝试仅使用该名称和点击的事件时间创建新事件。如果快速创建失败,则回退到完整表单对话框。快速创建视图ID
当设置属性
quick_create
时打开的视图,用户创建事件而非默认对话框。创建名称字段
记录的字段名称,该字段保存记录的文本表示形式,这在通过“快速创建”机制创建记录时使用。
全天
记录上表示相应事件是否被标记为全天事件(持续时间不相关)的布尔字段名称
模式
默认加载日历时的显示模式。可能的属性包括:
day
,week
,month
,year
比例
用逗号分隔的缩放级别列表。默认情况下,所有缩放级别都可用。请参阅 mode 以获取可能的缩放值。
创建
,删除
允许通过将相应的属性设置为
false
来在视图中禁用对应的动作。<字段>
声明用于聚合或在看板 逻辑 中使用的字段。如果该字段仅在日历卡片中显示。
字段可以具有其他属性:
invisible
使用 “True” 在卡片中隐藏该值
头像字段
仅用于 x2many 字段,在卡片中显示头像而不是 display_name
写入模型
和写入字段
和过滤字段
你可以添加一个筛选器并将结果保存到定义的模型中,筛选器会显示在侧边栏中。
filter_field
是可选的,用于指定将保存筛选器状态的字段。筛选器
和颜色
使用 “True” 在侧边栏的筛选器中添加此字段。您可以指定一个
color
字段,用于对复选框进行着色。
模型通用项¶
- Model._date_name = 'date'
field to use for default calendar view
活动¶
活动视图用于显示与记录相关联的活动。数据以图表形式展示,记录作为行,活动类型作为列。每行的第一个单元格显示一个(可自定义,参见 templates
,与 看板 非常相似)卡片,表示相应的记录。单击其他单元格时,将显示该记录相同类型的所有活动的详细描述。
警告
活动视图仅在安装了 mail
模块,并且模型继承自 mail.activity.mixin
时才可用。
活动视图的根元素是 <activity>
,它接受以下属性:
字符串
(必填)一个标题,用于描述该视图
视图元素的可能子元素包括:
字段
声明用于活动 逻辑 的字段。如果该字段仅在活动视图中显示,则无需预先声明。
可能的属性包括:
名称
(必填)要获取的字段的名称
templates
定义了 QWeb 模板 模板。卡片定义可以拆分为多个模板以提高清晰度,但活动视图 必须 定义一个根模板
activity-box
,该模板将为每条记录渲染一次。活动视图主要使用标准的 JavaScript QWeb,并提供以下上下文变量(详见 看板 以获取更多详细信息):
小部件
当前的
ActivityRecord()
可用于获取一些元数据。这些方法也可以直接在模板上下文中使用,无需通过widget
访问。记录
一个包含所有请求字段作为其属性的对象。每个字段有两个属性
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>,它接受以下属性:
字符串
(必填)一个标题,用于描述该视图
date_start
(必填)一个有效的日期或日期时间字段。此字段被视图理解为记录的开始日期
date_stop
(必填)一个有效的日期或日期时间字段。该字段被视图理解为记录的结束日期。这个字段将决定流失。
disable_linking
(可选)设置为
1
以防止点击群组单元格时重定向到列表视图。- ``mode``(可选)
一个用于描述模式的字符串。它应该是 ‘churn’ 或 ‘retention’(默认)。在 churn 模式下,数值将从 0% 开始随时间累积,而在 retention 模式下,数值将从 100% 开始随时间减少。
时间线
(可选)一个用于描述时间线的字符串。它应该是 “backward” 或 “forward”(默认)。正向时间线将从 date_start 显示到 date_stop,而反向时间线则会从 date_stop 显示到 date_start(当 date_start 在未来 / 大于 date_stop 时)。
interval
(可选)一个用于描述时间间隔的字符串。它应该是 ‘day’、’week’、’month’(默认)或 ‘year’。
测量
(可选)可以进行聚合的字段。此字段将用于计算每个单元格的值。如果未设置,群组视图将统计出现次数。
<字段>
(可选)允许指定一个特定字段,以便从可用的度量中对其进行管理,其主要用途是隐藏该字段,使其不显示在可选度量中:
名称
(必填)视图中使用的字段名称。
字符串
(可选)字段在群组视图中显示时使用的名称,将覆盖字段的默认 Python 字符串属性。
invisible
(可选)如果为 true,则该字段既不会出现在活动度量中,也不会出现在可选度量中(对于无法进行聚合的字段很有用,例如单位不同的字段,如 € 和 $)。如果值是一个域,则在当前行记录的上下文中对域进行求值,如果为
True
,则在该单元格上设置相应的属性。小部件
(可选)字段显示的替代表示形式。
- odoo.addons.base.models.ir_ui_view.sample
如果当前模型未找到任何记录,视图是否应使用一组示例记录进行填充。
这些假数据记录对某些字段名称/模型有启发式处理。例如,在模型
res.users
上的字段display_name
会填充示例人员姓名,而email
字段则会采用firstname.lastname@sample.demo
的格式。用户无法与这些数据进行交互,一旦执行任何操作(如创建记录、添加列等),这些数据将被立即丢弃。
- 要求
可选
- 类型
布尔值
- 默认
False
网格¶
Enterprise feature限制¶
此视图仍在开发中,可能需要扩展或修改。
只有
date
列字段经过了测试,selection
和many2one
虽然名义上已实现并受支持,但尚未经过测试,datetime
完全未实现。列单元格几乎无法配置,并且必须为数值类型
单元格调整默认是禁用的,必须进行配置以启用。
create
、edit
和delete
ACL 元数据由于fields_view_get
后处理的限制,不会自动设置在视图根节点上(有一个固定显式列表,列出了获得这些属性的视图类型)
模式¶
网格视图在此模块中拥有自己的架构和额外的验证。视图架构如下:
- ``<grid>``(1)
架构根元素
必填的
string
属性可选的
create
、edit
和delete
属性可选的
调整
和adjust_name
属性调整
可以是对象
或动作
,以指示单元格的调整是通过方法调用还是动作执行来完成的。adjust_name
分别提供方法名称和动作 ID。在两种情况下,调整参数都作为
grid_adjust
上下文成员提供,在object
情况下,参数也作为位置函数参数提供(紧随一个空的 id 列表):行域
匹配调整后单元格整行的域
列字段
调整后的单元格的列名
列值
该调整单元格的列值
字段
调整后的单元格的度量字段
修改
单元格旧值与调整后值之间的差异,可能是正数也可能是负数
可选的
hide_line_total
和hide_column_total
属性hide_line_total
设置为 true 以隐藏总计行(默认为 false)
隐藏列总计
设置为 true 以隐藏总计列(默认为 false)
可选的
barchart_total
属性柱状图总计
设置为
true
以在网格底部显示一个基于列总计的条形图(默认为 false)。
可选的
create_inline
和display_empty
属性创建内联
设置为
true
以在网格底部显示一行额外的内容,其中包含一个添加一行
按钮(默认为 false)。当此选项设置为true
时,控制面板中的添加一行
按钮将被隐藏。当没有数据可用且未设置display_empty``(即当帮助内容显示时),控制面板中的 ``添加一行
按钮将显示,以便用户创建第一条记录。显示空值
设置为
true
以在没有数据时继续显示网格(默认为 false)。当您希望用户能够跟踪当前期间(因为日期显示在列标题中)时,这会很有用。提醒一下,当没有数据且此属性未设置时,将显示帮助内容而不是网格。
<按钮>
(0+)常规 Odoo 动作按钮,在视图标题中显示
必填的
string
属性(按钮标签)必须的
type
属性,可以是object
或动作
注解
工作流按钮不被支持
必须的
name
属性,可以是调用的方法名称,也可以是要执行的动作的 ID可选
context
服务器回调函数会接收到视图中显示的所有记录 ID,要么是作为方法调用时传入的
object
按钮的 ID,要么是作为上下文中的active_ids``(``动作
按钮)传递的。<字段类型="行">
(1+)行分组字段,如果有设置搜索视图的分组筛选器,则将被替换。
视图中
row
字段的顺序决定了其分组深度:如果第一个字段是school
,第二个字段是age
,则记录将首先按school
分组,并在每个学校内按age
进行分组。<字段类型="列">
(1)列分组字段。
col
字段可以包含 0 个或多个<range>
元素,这些元素用于指定可自定义的列范围。range
元素具有以下必填属性名称
可以使用
grid_range
上下文值来覆盖默认范围(默认为第一个范围)字符串
范围按钮的标签(用户可见)
span
视图中一次显示的所有列的符号名称,可能会触发分页。
对于
date
字段,有效的跨度目前为week
和month
。步骤
步骤在某一列与前一列/后一列之间的符号名称
对于
date
字段,当前唯一有效的跨度是day
。
<field type="measure">
(1)单元格字段,自动汇总(通过
read_group
)。该字段可以使用
widget
属性来自定义其显示方式。
服务器交互¶
除了可选按钮外,网格视图当前调用两个方法:
``read_grid``(由模块提供给所有模型)返回网格的几乎全部内容作为字典:
行标题是一个包含以下键的字典列表:
值
(必填)这映射到一个字典,每个
row
字段对应一个键,值 始终 是[value, label]
的形式。domain
(必填)此行来源的任何记录的域,在需要在单元格调整期间复制记录时使用
列标题是一个字典列表,至少包含一个键:
值
(必填)查看行标题值
domain
(必填)查看列域值
当前
(可选)布尔类型,用于标记/突出显示一列
网格数据作为列表(行)的列表(单元格)的单元格字典,每个字典包含以下键:
值
单元格关联的数值
域
该单元格记录的域匹配(应视为不透明)
大小
单元格中分组的记录数量
只读
(可选)一个布尔值,表示此特定单元格不应为客户端可编辑状态
类
(可选)单元格容器上要添加的类列表(作为字符串),位于单元格的 TD 和单元格的可编辑元素之间。
如果此列表与基础类(以
o_grid_cell_
为前缀)发生冲突,此列表中的类将被忽略。
请注意,网格数据是*密集*的,如果查询数据库时没有找到与单元格匹配的用户组,该单元格将生成一个“空”单元格,并为必填键使用默认值。
prev
和next
,可以是假值(无分页),也可以是将合并到视图自身上下文中的上下文项,用于通过read_grid
读取上一页或下一页。应将其视为不透明的。
read_grid_domain(field, range)``(由模块提供给所有模型)返回与当前配置的“网格跨度”匹配的域。``read_grid
内部也会执行此操作,但有时独立调用此方法也是有用或必要的,例如配合search_count
或read_group
使用。adjust_grid
,目前尚无统一的实现方式,其语义可能会随着时间和使用场景的变化而演变。
服务器钩子¶
read_grid
调用多个钩子,允许在不覆盖整个方法的情况下自定义其操作:
_grid_format_cell(用户组, 单元格字段)
将 read_group(按组分组)的输出转换为上述格式的单元格(作为“网格数据”的一部分)
_grid_make_empty_cell(row_domain, column_domain, view_domain)
如果不存在对应的用户组,则生成一个空的单元格版本
_grid_column_info(名称, 范围)
根据列类型生成一个 ColumnMetadata 对象,将值直接返回(作为
read_grid
的一部分)或用于查询并重新格式化read_group
为read_grid
:grouping
实际的列分组字段/查询
域
在列字段分页的情况下,应用于
read_group
的域,可以是一个空列表上一页
和下一页
上下文片段,这些片段将被发送到
read_grid
以获取当前页之前和之后的页面。如果为False
,则禁用该方向的分页。值
每页显示的列值,每个值是一个字典,包含以下键:
值
用于整个列的字段名称到值的字典映射,通常只是
name
-> 一个值域
与该特定列匹配的域
当前
True
如果当前列应在网格中特别标出,False
否则格式
如何将该列/类型的值从
read_group
格式转换为read_grid
格式(与 ColumnInfo 中的values
匹配)
访问控制列表¶
如果视图不可编辑,单个单元格将不可编辑
如果视图不可创建,将不会显示
Add a Line
按钮(它目前用于创建一条新记录)
上下文键¶
网格范围
选择在视图包含多个范围时,默认应使用的范围
网格锚点
如果适用,将用作列范围的默认锚点,而不是
read_grid
定义的默认值。对于日期字段,这是计算初始时间范围的参考日期。默认的日期锚点是”今天”(在用户的时区中)
甘特图¶
Enterprise feature甘特视图适当显示甘特图(用于调度)。
甘特图视图的根元素是 <gantt/>
,它没有子元素,但可以包含以下属性:
- 字符串
字符串(默认:
''
)如果打开一个没有名称的动作,且目标为 “new”(打开对话框),则会显示此视图标题。
- 创建
bool(默认:
True
)禁用/启用视图中的记录创建。
- 编辑
bool(默认:
True
)禁用/启用视图中的记录编辑。
- 删除
bool(默认:
True
)通过 动作 下拉菜单禁用/启用视图中的记录删除。
date_start
(必填)记录中提供事件开始时间的字段名称。
date_stop
(必填)记录中提供事件结束时间的字段名称。
依赖字段
用于在两个记录之间提供依赖关系的
many2many
字段名称。如果 B 依赖于 A,则dependency_field
是允许从 B 获取 A 的字段。此字段和dependency_inverted_field
字段一起用于在标签之间绘制依赖箭头并重新安排它们。反向字段
(如果提供了依赖字段
,则为必填项)many2many
字段的名称,该字段提供了与dependency_field
相反的依赖关系。如果 B 依赖于 A,则dependency_inverted_field
是允许从 A 获取 B 的字段。颜色
根据其值对标签进行着色的字段名称
装饰-{$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>
默认分组字段
按字段分组任务的名称
disable_drag_drop
如果设置为 true,甘特图视图将不支持拖放操作
合并
记录单元格中要显示的合并值的字段名称
合并最大值
包含 “按…分组” 字段作为键,以及在单元格显示为红色之前可以达到的最大合并值的字典(例如
{"user_id": 100}
)排除合并
字段名称,用于描述如果设置为 true,则该任务是否应从合并中排除。如果设置为 true,会在合并行中显示一个条纹区域。
创建
,单元格创建
,编辑
,删除
,计划`
允许通过将相应的属性设置为
false``(默认值:``true
)来在视图中*禁用*相应的动作。create
: 如果启用,控制面板中将显示一个添加
按钮,用于创建记录。cell_create
: 如果启用且create
也启用,在时间槽单元格上悬停时将显示一个 “+” 按钮,用于在该时段创建新记录。edit
: 如果启用,打开的记录将处于编辑模式(即可编辑)。plan
: 如果已启用且edit
也已启用,则在时间槽上会显示一个“放大镜”按钮,用于将未分配的记录安排到该时间槽中。
Example
当你不希望在甘特图视图中创建记录,并且模型中的开始和结束日期为必填项时,应禁用计划功能,因为将永远找不到任何记录。
偏移量
根据规模,需要添加到今天的单位数量以计算默认期间。示例:在 default_scale 为周的情况下,偏移量 +1 将打开下周的甘特图视图;在 default_scale 为月的情况下,偏移量 -2 将打开两个月前的甘特图视图。
进度
记录事件的完成百分比字段名称,范围在 0 到 100 之间
字符串
甘特视图的标题
精度
指定每个刻度上药丸的吸附精度的 JSON 对象。
scale 为
day
时的可选值为(默认值:hour
):hour
:记录时间按整点对齐(例如:7:12 会变为 8:00)hour:half
:记录时间对齐到半小时(例如:7:12 变为 7:30)hour:quarter
:将时间记录对齐到半小时(例如:7:12 会变为 7:15)
scale
week
的可能取值为(默认值:day:half
):day
:记录时间对齐到完整天数(例如:上午7:28变为前一天的23:59:59,晚上10:32变为当天的12:00 PM)day:half
:记录时间对齐到半小时(例如:上午7:28 变为中午12:00)
scale 的可能取值为
month``(默认值:``day:half
):day
:记录时间对齐到完整天数(例如:上午7:28变为前一天的23:59:59,晚上10:32变为当天的12:00 PM)day:half
:记录时间对齐到半小时(例如:上午7:28 变为中午12:00)
将
year
st 始终对齐到完整的一天。精度属性示例:
{"day": "hour:quarter", "week": "day:half", "month": "day"}
总计行
布尔值,用于控制是否显示包含记录总数的行。(默认:
false
)折叠第一级
布尔值,用于控制在按一个字段分组时是否可以折叠每行。(默认:
false
,按两个字段分组时开始支持折叠)显示不可用性
布尔值,用于标记模型的
gantt_unavailability
函数返回的日期在甘特视图中为可用。这些记录仍然可以被安排,但其不可用状态会以视觉方式显示。(默认:false
)默认比例
视图渲染时的默认比例。可能的值包括(默认:
month
):天
周
月份
年
比例
允许在此视图中使用的比例的逗号分隔列表。默认情况下,允许所有比例。有关此列表中可使用的比例值,请参见
default_scale
。templates
定义了 QWeb 模板 模板
gantt-popover
,该模板在用户将鼠标悬停在甘特视图中的某个记录上时使用。甘特视图主要使用标准的 JavaScript QWeb,并提供以下上下文变量:
小部件
当前的
GanttRow()
可用于获取一些元数据。将颜色转换为整数的getColor
方法也可以直接在模板上下文中使用,而无需使用widget
。on_create
如果在点击视图中的“添加”按钮时指定,将不会打开通用对话框,而是启动一个客户端动作。这应该包含该动作的 XML ID(例如:
on_create="%(my_module.my_wizard)d"
)
表单视图ID
当用户创建或编辑记录时打开的视图。请注意,如果未设置此属性,甘特图视图将回退到当前操作中的表单视图的 ID(如果有的话)。
动态范围
如果设置为 true,甘特视图将从第一条记录开始,而不是从年初/月初/日开始。
字段标签
如果设置为 true,则当缩放级别设置为周或月时,时间会显示在标签中。例如:
7:00 AM - 11:00 AM (4h) - 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此视图能够在地图上显示记录及其之间的路线。记录以标记(pins)的形式表示。它还允许在与记录标记相关联的弹出窗口中可视化模型中的字段。
注解
该视图所应用的模型应包含一个 res.partner
的 many2one 字段,因为该视图依赖于 res.partner
的地址和坐标字段来定位记录。
接口¶
该视图使用位置数据平台的接口来获取地图背景图块(tiles),执行地理正向编码(将地址转换为一组坐标)并获取路线。该视图实现了两个接口:OpenStreetMap 和 MapBox。默认使用 OpenStreetMap,能够获取 tiles 并执行 geoforwarding。此接口不需要令牌。一旦在通用设置中提供了有效的 MapBox 令牌,视图将切换到 MapBox 接口。该接口速度更快,并支持路线计算。可以通过 signing up 到 MapBox 获取令牌。
结构组件¶
视图的根元素是 <map>
。它可能具有以下属性:
res_partner
包含
res.partner
的 many2one 字段。如果没有提供,视图将默认创建一个空地图。默认排序
如果提供了字段,视图将覆盖模型的默认排序。该字段必须是视图所应用的模型的一部分,而不是来自
res.partner
。路由
如果
1
,则显示记录之间的路线。该视图需要有效的 MapBox 令牌,并且至少有两个定位的记录(即记录包含res.partner
多对一字段,且该业务伙伴具有地址或有效坐标)。隐藏名称
如果
1
,则从便签的弹出窗口中隐藏名称(默认:0
)。隐藏地址
如果
1
,则在图钉的弹出窗口中隐藏地址(默认:0
)。隐藏标题
如果
1
,则从固定列表中隐藏标题(默认:0
)。面板标题
要显示为固定列表标题的字符串。如果未提供,则标题为动作的名称,或者如果视图不在动作中,则为“项目”。
限制
最多要获取的记录数(默认:
80
)。必须为正整数。
<map>
元素可以包含多个 <field>
元素。每个 <field>
元素被解释为图钉弹出窗口中的一行。字段的属性如下:
名称
要显示的字段。
字符串
字段内容之前的显示字符串。可以用作描述。
- 例如,这里是一个地图:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1"> <field name="partner_id" string="Customer Name"/> </map>