视图架构¶
通用架构¶
视图的架构由 JavaScript 框架解释的 XML 数据定义。
大多数视图都有一个 *.rng 文件,用于定义属性与可能的架构。某些视图不受此类文件约束,原因是它们接受 HTML 内容,或出于性能考虑。
注解
当前上下文和用户访问权限可能会影响视图的能力。
更多内容
Python 表达式¶
在计算节点属性(例如 readonly 修饰符)时,可以提供 Python 表达式,该表达式将在能访问以下变量的环境中执行:
当前视图中所有字段的名称,包含当前记录的值,但 列表视图 中的
column_invisible除外;关联字段以 ID 列表的形式给出;当前记录的 ID;
parent:指向容器的记录;仅出现在 关联字段 的子视图中;context (dict):当前视图的上下文;uid (int):当前用户的 id;today (str):当前本地日期,格式为YYYY-MM-DD;now (str):当前本地日期时间,格式为YYYY-MM-DD hh:mm:ss。
示例
<field name="field_a" readonly="True"/>
<field name="field_b" invisible="context.get('show_me') and field_a == 4"/>
示例
<field name="field_a"/>
<field name="x2m">
<!-- sub-view -->
<form>
<field name="field_b" invisible="parent.field_a"/>
</form>
</field>
窗体¶
表单视图用于显示单条记录的数据。它们由常规 HTML 以及附加的语义组件和结构组件构成。
表单视图的根元素是 form。
<form>
...
</form>
根属性¶
可以向根元素 form 添加可选属性以自定义视图。
- string
视图标题。仅当您打开一个没有名称、且 target 为
new的动作(即打开对话框)时才会显示。- 要求
可选
type- 默认
''
- create
禁用/启用视图中的记录创建。
- 要求
可选
type- 默认
True
- edit
禁用/启用视图中的记录编辑。
- 要求
可选
type- 默认
True
- duplicate
通过 操作 下拉菜单启用/禁用视图上的记录复制。
- 要求
可选
type- 默认
True
- delete
禁用/启用通过 操作 下拉菜单删除视图中的记录。
- 要求
可选
type- 默认
True
- js_class
Web 客户端将实例化以替代表单视图的 JavaScript 组件的名称。
- 要求
可选
type- 默认
''
- disable_autofocus
禁用对视图第一个字段的自动聚焦。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
语义组件¶
语义组件与 Odoo 系统对接,并允许与其交互。
表单视图接受以下子语义组件:字段、标签、按钮、Chatter 小组件 和 附件预览小组件。
占位符以全大写表示。
field:显示字段值¶
field 元素渲染当前记录的单个字段(在可能的情况下也允许编辑)。
表单视图支持多次使用同一字段,并且这些字段可以为 invisible 和 readonly 属性设置不同的值。这些字段的值可能相同,但显示方式可以不同。但是,当存在多个 required 属性取值不同的字段时,其行为无法保证。
<form>
<field name="FIELD_NAME"/>
</form>
field 元素可以具有以下属性:
- name
要渲染的字段名称。
- 要求
必需
type
- widget
用于表示该字段的小组件。所选小组件可以改变字段的渲染方式和/或编辑方式。它指向注册到
fields注册表中的一个 JavaScript 实现(Owl 组件)。- 要求
可选
type
- id
节点 id。当视图中多次出现同一字段时很有用(参见 label:显示字段标签)。
- 要求
可选
type- 默认
字段名称
- string
字段的标签。
- 要求
可选
type- 默认
模型字段的
string属性
- help
悬停在字段或其标签上时显示的工具提示。
- 要求
可选
type- 默认
''
- options
字段小组件的配置选项(包括默认小组件),以可求值为 dict 的 Python 表达式给出。
对于关联字段,可使用以下选项:
no_create、no_quick_create、no_open和no_create_edit。示例
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'FIELD_NAME', 'no_quick_create': True}"/>
- 要求
可选
type- 默认
{}
- readonly
字段是否可由用户修改(
False)或为只读(True),取值为一个求值结果为布尔值的 Python 表达式。示例
<field name="fname_a" readonly="True"/> <field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
- 要求
可选
type- 默认
False
- required
字段是否可以留空(
False)或必须填写(True),取值为一个求值结果为布尔值的 Python 表达式。示例
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- 要求
可选
type- 默认
False
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- domain
选择已有记录时应用的过滤条件,以可求值为 域 的 Python 表达式给出。
示例
<field name="fname" domain="[('fname_a', '=', parent.fname_b)]"/>
- 要求
可选
type- 默认
[]- 范围
关系字段
- context
获取可能值以及创建或搜索记录时使用的上下文,以可求值为 dict 的 Python 表达式给出。
示例
<field name="fname" context="{ 'TYPE_view_ref': 'ADDON.MODEL_view_TYPE', 'group_by': 'FIELD_NAME', 'default_FIELD_NAME': ANY, 'search_default_FIELD_NAME': True, 'OTHER_BUSINESS_KEY': ANY, }"/>
- 要求
可选
type- 默认
{}- 范围
关系字段
- nolabel
是否应隐藏字段标签。
- 要求
可选
type- 默认
False- 范围
作为
group元素直接子级的字段
- placeholder
在 空 字段上显示的帮助消息。它可以在复杂表单中替代字段标签。但是,它 不应 作为数据示例,因为用户可能会将占位符文本与已填充的字段混淆。
- 要求
可选
type- 默认
''
- mode
用于该字段关联记录的显示模式(视图类型)列表,以逗号分隔。允许的模式有:
list、form、kanban和graph。- 要求
可选
type- 默认
list- 范围
One2many和Many2many字段
- class
要设置在所生成元素上的 HTML 类。
样式使用 Bootstrap 框架和 UI 图标。常用的 Odoo 类包括:
oe_inline:避免字段后出现通常的换行,并限制其跨度;oe_left、oe_right:将元素 floats (浮动)到相应方向;oe_read_only、oe_edit_only:仅在相应的表单模式下显示该元素;oe_avatar:对于图片字段,将图片以“头像”形式显示(最大 90x90 的正方形);oe_stat_button:定义一种特定渲染方式,用于动态显示信息,同时可点击以触发某个动作。
示例
<field name="fname" class="oe_inline oe_left oe_avatar"/>
示例
<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP"> <div class="o_field_widget o_stat_info"> <span class="o_stat_value"><FIELD/></span> <span class="o_stat_text">TEXT</span> </div> </button>
- 要求
可选
type- 默认
''
- filename
提供文件名的关联字段的名称。
- 要求
可选
type- 默认
''- 范围
Binary字段
- password
该字段是否存储密码,若是则不应显示其数据。
- 要求
可选
type- 默认
False- 范围
Char字段
- default_focus
视图打开时该字段是否获得焦点。它只能应用于视图中的一个字段。
- 要求
可选
type- 默认
False
注解
关联字段 节点可以包含特定的子视图。
示例
<field name="children_ids">
<list>
<field name="name"/>
</list>
<form>
<field name="id"/>
<field name="name"/>
</form>
</field>
label:显示字段标签¶
当 字段 组件未直接放在 组 内,或设置了其 nolabel 属性时,字段标签不会自动与字段值一起显示。label 组件是手动显示字段标签的替代方案。
<form>
<div class="col col-md-auto">
<label for="FIELD_NAME" string="LABEL"/>
<div>
<field name="FIELD_NAME" class="oe_inline"/>
</div>
</div>
</form>
label 元素可以具有以下属性:
- for
与该标签关联的字段引用。它可以是字段名称,也可以是字段的 id(在 字段 上设置的
id属性)。当视图中多次出现同一字段,且有多个
label组件与这些字段节点关联时,这些标签必须具有唯一的for属性;在这种情况下,应引用相应字段节点的id属性。- 要求
必需
type
- string
要显示的标签。
- 要求
可选
type- 默认
来自模型上字段定义的字段标签
- class
要设置在所生成元素上的 HTML 类。
样式使用 Bootstrap 框架和 UI 图标。常用的 Odoo 类包括:
oe_inline:避免字段后出现通常的换行,并限制其跨度;oe_left、oe_right:将元素 floats (浮动)到相应方向;oe_read_only、oe_edit_only:仅在相应的表单模式下显示该元素;oe_avatar:对于图片字段,将图片以“头像”形式显示(最大 90x90 的正方形);oe_stat_button:定义一种特定渲染方式,用于动态显示信息,同时可点击以触发某个动作。
示例
<field name="fname" class="oe_inline oe_left oe_avatar"/>
示例
<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP"> <div class="o_field_widget o_stat_info"> <span class="o_stat_value"><FIELD/></span> <span class="o_stat_text">TEXT</span> </div> </button>
- 要求
可选
type- 默认
''
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
Chatter 小组件¶
Chatter 小组件 是沟通与日志工具,可直接从记录(任务、订单、发票、事件、备注……)向同事和客户发送电子邮件。
当模型继承 mail.thread Mixin 时,会通过一个 chatter 元素添加它。
示例
<form>
<sheet>
...
</sheet>
<chatter/>
</form>
附件预览小组件¶
附件预览小组件通过一个 空 的 div 元素添加,其类为 o_attachment_preview。
示例
<form>
<sheet>
...
</sheet>
<div class="o_attachment_preview"/>
<form>
结构组件¶
结构组件提供结构或“视觉”特性,几乎不涉及逻辑。它们以元素或元素集的形式用于表单视图。
表单视图接受以下子结构组件:组、工作表、笔记本、笔记本、换行、分隔符、页眉、页脚、按钮容器 和 标题容器。
占位符以全大写表示。
group:定义列布局¶
group 元素用于在表单中定义列布局。默认情况下,分组定义 2 列,且分组的大多数直接子元素只占一列。
作为分组的直接子元素的 field 元素默认会显示 label,且标签和字段本身各自的 colspan 均为 1。
子元素按水平方向排布(它们会先尝试填满下一列,然后才换行)。
<form>
<group>
...
</group>
</form>
group 元素可以具有以下属性:
- string
为该分组显示的标题。
- 要求
可选
type- 默认
''
- col
group中的列数。- 要求
可选
type- 默认
2
- colspan
子元素占用的列数。
- 要求
可选
type- 默认
1
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
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
选项卡的标题。
- 要求
可选
typestr- 默认
''
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
其渲染效果的可能结构与表示形式
<form>
<notebook>
<page string="Page1">
...
</page>
<page string="Page2">
...
</page>
</notebook>
</form>
|
newline:开始新的分组行¶
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
作为节标题显示的标题。
- 要求
可选
typestr- 默认
''
其渲染效果的可能结构与表示形式
<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>
平台设置¶
设置视图是 form 视图的一种定制。它们用于在集中的位置显示设置。它们与通用表单视图的区别在于具有搜索栏和侧边栏。
示例
<app string="CRM" name="crm">
<setting type="header" string="Foo">
<field name="foo" title="Foo?."/>
<button name="nameAction" type="object" string="Button"/>
</setting>
<block title="Title of group Bar">
<setting help="this is bar" documentation="/applications/technical/web/settings/this_is_a_test.html">
<field name="bar"/>
</setting>
<setting string="This is Big BAR" company_specific="1">
<field name="bar"/>
</setting>
</block>
<block title="Title of group Foo">
<setting string="Personalize setting" help="this is full personalize setting">
<div>This is a different setting</div>
</setting>
</block>
</app>
组件¶
设置视图接受 form 视图的 field、label 和 button 元素,以及三个额外的子元素:app、block 和 setting。
占位符以全大写表示。
app:声明应用¶
app 元素用于在设置视图上声明应用。它会在视图的侧边栏中创建一个带有应用徽标的条目。它在搜索时还充当分隔符。
<form>
<app string="NAME" name="TECHNICAL_NAME">
...
</app>
</form>
app 元素可以具有以下属性:
- string
应用的名称。
- 要求
必需
type
- name
应用的技术名称(模块名)。
- 要求
必需
type
- logo
徽标的 relative path。
- 要求
可选
type- 默认
使用
name属性计算出的路径:/name/static/description/icon.png
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
block:声明一组设置¶
block 元素用于声明一组设置。该组可以具有标题和描述。
<form>
<app string="NAME" name="TECHNICAL_NAME">
...
<block title="TITLE">
...
</block>
...
</app>
</form>
block 元素可以具有以下属性:
- title
设置块的标题。可以按其值进行搜索。
- 要求
可选
type- 默认
''
- help
设置块的描述。可以按其值进行搜索。
- 要求
可选
type- 默认
''
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
setting:声明设置¶
setting 元素用于声明设置本身。
设置中的第一个 field 元素用作主字段。如果它是布尔字段,则放在左侧面板,否则放在右侧面板的顶部。如果未定义 string 属性,该字段还用于创建设置标签。
setting 元素还可以包含其他元素(例如 HTML)。所有这些元素都渲染在右侧面板中。
<form>
<app string="NAME" name="TECHNICAL_NAME">
<block title="TITLE">
...
<setting string="SETTING_NAME">
...
<field name="FIELD_NAME"/>
...
</setting>
...
</block>
</app>
</form>
<setting> 元素可以具有以下属性:
- type
默认情况下,设置会在视觉上分为两个面板(左侧和右侧),用于编辑指定的 field。通过定义
type="header",则会改为渲染一种特殊类型的设置。该设置用于修改其他设置的作用范围。例如,在网站应用中,该设置用于指明其他设置应用于哪个网站。header 设置以屏幕顶部的横幅形式呈现。- 要求
可选
type- 默认
''
- string
用作设置标签的文本。
- 要求
可选
type- 默认
第一个字段的标签
- title
用作工具提示的文本。
- 要求
可选
type- 默认
''
- help
设置的描述。该文本显示在设置标签的正下方(类为
text-muted)。- 要求
可选
type- 默认
''
- company_dependent
设置是否特定于公司。若设置,图标会显示在设置标签旁边。
它只接受值
'1'。- 要求
可选
type- 默认
''
- documentation
指向该设置的文档的 path。若设置,可点击的图标会显示在设置标签旁边。该路径既可以是绝对路径,也可以是 relative path。在后一种情况下,它相对于
https://www.odoo.com/documentation/<version>。- 要求
可选
typepath_- 默认
''
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
列表¶
列表视图的根元素是 list,之前的名称是 tree。
其渲染效果的可能结构与表示形式
<list>
...
</list>
|
根属性¶
可以向根元素 list 添加可选属性以自定义视图。
- string
视图标题。仅当您打开一个没有名称、且 target 为
new的动作(即打开对话框)时才会显示。- 要求
可选
type- 默认
''
- create
禁用/启用视图中的记录创建。
- 要求
可选
type- 默认
True
- edit
禁用/启用视图中的记录编辑。
- 要求
可选
type- 默认
True
- delete
禁用/启用通过 操作 下拉菜单删除视图中的记录。
- 要求
可选
type- 默认
True
- import
在视图上禁用/启用从数据导入记录。
- 要求
可选
type- 默认
True
- export_xlsx
在视图上禁用/启用将记录导出为数据。
- 要求
可选
type- 默认
True
- editable
使视图中的记录可就地编辑,并允许从列表的某一行创建新记录。它可以具有两个不同的值:
- top
新记录从列表顶部创建。
- bottom
新记录从列表底部创建。
内联 form 视图的结构派生自列表视图。因此,表单视图的字段和按钮上有效的大多数属性也会被列表视图接受,不过如果列表视图不可编辑,它们可能没有任何意义。
重要
如果将
edit属性设置为False,则此行为被禁用。- 要求
可选
type- 默认
''
- multi_edit
激活多记录编辑功能,允许一次性将多条记录的某个字段更新为相同的值。
它只接受值
'1'。- 要求
可选
type- 默认
''
- open_form_view
在每行末尾显示一个按钮,用于在表单视图中打开该记录。
如果视图不可编辑,则此属性无效。
- 要求
可选
type- 默认
False
- default_order
以逗号分隔的字段名列表,用于覆盖通过
_order属性在模型上定义的排序。要反转某个字段的排序方向,请在其后加上
desc,并以空格分隔。示例
<list default_order="sequence,name desc"> ... </list>
- 要求
可选
type- 默认
''
- decoration-<style>
应应用于匹配记录行的样式,以计算结果为布尔值的 Python 表达式给出。
<style>必须替换为以下之一:bf表示粗体、it表示斜体、info、warning、danger、muted、primary和success。示例
<list decoration-danger="field_qty > field_limit"> ... </list>
- 要求
可选
type- 默认
False
- limit
页面的默认大小。它必须严格大于零。
- 要求
可选
type- 默认
80用于列表视图,40用于表单视图中的 X2many 列表
- groups_limit
列表视图分组时每页的默认分组数量。它必须严格大于零。
- 要求
可选
type- 默认
80用于列表视图,40用于表单视图中的 X2many 列表
- expand
列表视图分组时,是否默认展开第一层分组。
警告
根据分组数量的不同,速度可能会很慢。
- 要求
可选
type- 默认
False
- sample
如果当前模型未找到任何记录,是否用一组示例记录填充视图。
这些虚构记录针对某些字段名/模型采用了启发式规则。例如,模型
res.users上的display_name字段会填充为示例人名,而email字段则采用firstname.lastname@sample.demo的形式。用户无法与这些数据进行交互,一旦执行动作(创建记录、添加列等),这些数据就会被丢弃。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
组件¶
列表视图接受以下子元素:field、button、groupby、header 以及 control 和 create。
占位符以全大写表示。
field:显示字段值¶
field 元素将当前所有记录的单个字段渲染为一列(并可能允许编辑该字段)。
不支持在列表视图中多次使用同一字段
<list>
<field name="FIELD_NAME"/>
</list>
field 元素可以具有以下属性:
- name
要渲染的字段名称。
- 要求
必需
type
- widget
用于表示该字段的小组件。所选小组件可以改变字段的渲染方式和/或编辑方式。它指向注册到
fields注册表中的一个 JavaScript 实现(Owl 组件)。- 要求
可选
type
- string
字段的标签。
- 要求
可选
type- 默认
模型字段的
string属性
- optional
使字段的可见性变为可选。可以通过视图头部上的按钮隐藏或显示该字段的列。
它可以具有两个不同的值:
- show
该字段默认显示。
- hide
该字段默认隐藏。
示例
<field name="fname_a" optional="show"/> <field name="fname_b" optional="hide"/>
- 要求
可选
type
- readonly
字段是否可由用户修改(
False)或为只读(True),取值为一个求值结果为布尔值的 Python 表达式。示例
<field name="fname_a" readonly="True"/> <field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
- 要求
可选
type- 默认
False
- required
字段是否可以留空(
False)或必须填写(True),取值为一个求值结果为布尔值的 Python 表达式。示例
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- 要求
可选
type- 默认
False
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
- column_invisible
列是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。与
invisible不同,它作用于整列,并且在计算时不考虑子树的值。示例
<field name="product_is_late" column_invisible="parent.has_late_products == False"/> <button type="object" name="action_confirm" column_invisible="context.get('hide_confirm')"/> <column string="Contact" column_invisible="context.get('hide_contact')"> <field name="partner_id"/> <field name="email"/> </column>
- 要求
可选
type- 默认
False
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- decoration-<style>
应应用于匹配记录字段的样式,以计算结果为布尔值的 Python 表达式给出。
<style>必须替换为以下之一:bf表示粗体、it表示斜体、info、warning、danger、muted、primary和success。示例
<field name="name" decoration-bf="1"/> <field name="quantity" decoration-info="state == 'draft'"/>
- 要求
可选
type- 默认
False
- sum, avg
在列底部显示的聚合值。聚合仅针对当前显示的记录进行计算。聚合操作必须与相应字段的
aggregator相匹配。示例
<field name="sent" sum="Total" /> <field name="clicks_ratio" avg="Average"/>
- 要求
可选
type- 默认
''
- width
列表视图总是尝试优化各列之间的可用空间。对于某些字段类型,这会根据字段类型强制设定宽度来实现。例如,我们确切知道显示日期所需的像素数,因此可以确保日期字段的列不会占用超过严格必需的空间,从而将多余的空间留给其他列。然而,框架无法猜测每种字段类型的合适宽度。例如,char 字段既可以用于编码较大的值,也可以用于编码 3 个字母的国家代码。
width属性可用于指定给定列的理想宽度。它允许指定固定宽度(例如width="40px")、最小宽度(例如width="[40px]")或最小与最大宽度(例如width="[40px,70px]")。这些宽度表示渲染单元格内各值所需的空间。列的实际宽度则为给定值加上单元格左右内边距之和。注意:这些宽度始终以像素为单位,因此可以省略 “px” 后缀(例如
width="30")。- 要求
可选
type- 默认
''
- nolabel
字段的列标题是否应保持为空。若设置,该列将不可排序。
它只接受值
'1'- 要求
可选
type- 默认
''
注解
当列表视图被分组时,数值字段会按组聚合显示。此外,如果某个分组中的记录过多,分组行右侧会出现分页器。因此,在列表视图可能被分组的情况下,不建议将数值字段放在最后一列。不过,这对表单视图中的 X2many 字段没有问题,因为它们无法被分组。
其渲染效果的可能结构与表示形式
<list>
<field name="name" string="My Custom Name"/>
<field name="amount" sum="Total"/>
<field name="currency_id"/>
<field name="tax_id"/>
</list>
|
column:将多个字段组合到堆叠单元格中¶
<list>
<column string="LABEL">
<field name="FIELD_NAME_1"/>
<field name="FIELD_NAME_2"/>
</column>
</list>
column 元素将多个字段组合到单个表格单元格中,以堆叠行的形式显示它们。
column 元素可以具有以下属性:
- string
列标题中显示的标签。省略时,改用第一个堆叠字段的标签。
- 要求
可选
type
- width
列的理想宽度。省略时,宽度由第一个子字段推断得出。有关可接受的语法,请参阅
field元素的 width attribute。- 要求
可选
type
- column_invisible
列是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。与
invisible不同,它作用于整列,并且在计算时不考虑子树的值。示例
<field name="product_is_late" column_invisible="parent.has_late_products == False"/> <button type="object" name="action_confirm" column_invisible="context.get('hide_confirm')"/> <column string="Contact" column_invisible="context.get('hide_contact')"> <field name="partner_id"/> <field name="email"/> </column>
- 要求
可选
type- 默认
False
每个子 <field> 元素都支持与常规 list field 相同的属性。请注意,column_invisible 对子字段没有效果;请改为在 column 元素上使用它来隐藏整个堆叠列。
其渲染效果的可能结构与表示形式
<list>
<field name="name"/>
<column string="Contact">
<field name="partner_id"/>
<field name="email"/>
</column>
</list>
|
groupby:定义分组标题¶
在按 Many2one 字段对记录分组时,groupby 元素用于使用 button 元素定义分组标题。它也接受 field 元素,可用于修饰符。因此,这些字段属于 Many2one 的共模型。这些额外字段是批量获取的。
<list>
...
<groupby name="FIELD_NAME">
<BUTTONS/>
<FIELDS/>
</groupby>
</list>
groupby 元素可以具有以下属性:
- name
用作标题的
Many2one字段的名称。可以定义一个带有
type="edit"的特殊 button 元素,用于打开 Many2one 字段的表单视图。- 要求
必需
type
其渲染效果的可能结构与表示形式
<list>
<field name="name"/>
<field name="amount"/>
<field name="currency"/>
<field name="tax_id"/>
<groupby name="partner_id">
<button type="edit" name="edit"/>
<field name="email"/>
<button type="object" name="my_method" string="Button1" invisible="email == 'jhon@conor.com'"/>
</groupby>
</list>
|
注解
groupby 元素内部的字段仅用于获取和存储值,而从不会显示。
control:自定义创建和删除动作¶
control 元素允许自定义创建和删除动作。特别是,它允许添加带特定上下文的特殊创建按钮、将常规视图按钮用作创建动作,以及仅在特定条件下提供创建和删除动作。
重要
control 元素仅在 One2many 或 Many2many 字段内部的列表视图中受支持。
<list>
<control>
<create string="LABEL"/>
<BUTTONS/>
<delete invisible="parent.is_sent">
</control>
...
</list>
control 元素不接受任何属性。它接受以下子元素:
- create
给定的
create元素会替换默认的 添加一行 按钮。create元素可以具有以下属性:- string
按钮的文本。
- 要求
必需
type
- context
执行按钮调用时合并到视图上下文中的上下文,取值为一个求值结果为字典的 Python 表达式。
- 要求
可选
type- 默认
{}
- invisible
元素是可见的(
False)还是隐藏的(True),以计算结果为布尔值的 Python 表达式表示。在表达式中可以使用父记录和上下文。- 要求
可选
type- 默认
False
- button
与 常规视图按钮 相同
- delete¶
delete元素允许逐行有条件地隐藏删除图标。该类型只能有一个子元素。它只能有一个属性:- invisible
与
create相同,区别在于此处表达式中还可以使用记录本身。
其渲染效果的可能结构与表示形式
<list>
<field name="name"/>
<field name="amount"/>
<field name="currency"/>
<field name="tax_id"/>
<control>
<create string="Add an item"/>
<create string="Add a section" context="{'default_type': 'section'}"/>
<create string="Add a note" context="{'default_type': 'note'}"/>
</control>
</list>
|
搜索¶
搜索视图与其他视图类型不同,它并不用于显示内容。虽然搜索视图作用于特定的模型,但它用于筛选另一个视图的内容(通常是聚合视图,例如 列表 和 图表)。
搜索视图的根元素是 search。
它不接受任何属性。
其渲染效果的可能结构与表示形式
<search>
...
</search>
|
组件¶
搜索视图接受以下子元素: field、filter、separator、group 和 searchpanel。
占位符以全大写表示。
field:基于字段值筛选¶
field 元素使用用户提供的值来定义域或上下文。生成搜索域时,各字段域之间以及字段域与筛选器之间使用 AND 运算符连接。
<search>
<field name="FIELD_NAME"/>
</search>
field 元素可以具有以下属性:
- name
用于筛选的字段名称。
- 要求
必需
type
- string
字段的标签。
- 要求
可选
type- 默认
模型字段的
string属性
- operator
默认情况下,字段生成的域形式为
[(name, operator, value)],其中name是字段名称,value是用户提供的值,该值可能经过筛选或转换(例如,用户应提供选择字段值的 label,而不是值本身)。operator属性可用于覆盖默认运算符,默认运算符取决于字段类型(例如,浮点型字段为=,而字符型字段为ilike,many2one 字段为child_of)。- 要求
可选
type- 默认
=
- filter_domain
用作字段搜索域的域,以 Python 表达式给出,该表达式的求值结果为一个 域。
它可以使用
self变量将用户提供的值注入自定义域中。与仅使用operator属性相比,它可以生成灵活得多的域(例如,一次搜索多个字段)。如果同时提供了
operator和filter_domain属性,则以filter_domain为准。- 要求
可选
type- 默认
[]
- context
要合并到搜索视图所针对的视图上下文中的上下文,以 Python 表达式给出,该表达式的求值结果为一个 dict。
它可以包含用户提供的值,这些值可通过
self变量获取。- 要求
可选
type- 默认
{}
- domain
要应用于支持自动补全的字段(例如
Many2one)的补全结果的筛选条件。- 要求
可选
type- 默认
[]
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
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
筛选器的标签。
- 要求
必需
type
- help
鼠标悬停在筛选器上时显示的工具提示。
- 要求
可选
type- 默认
''
- domain
作为搜索域的一部分追加到动作的域中的域。
- 要求
可选
type- 默认
[]
- date
用于筛选的
date或datetime字段的名称。使用此属性时,会创建一组可在 筛选 菜单的子菜单中使用的筛选器。可用的筛选器与时间相关,但在其域于实例化控制面板时求值这一意义上并非动态的。
示例
<filter string="Creation Date" name="filter_create_date" date="create_date"/>
默认情况下,这些筛选器包含一个下拉菜单,其中带有不同的子筛选器,可按月、季度和年份进行筛选。此外,还可以创建使用域进行筛选的自定义子筛选器。这些自定义筛选器必须具有以下属性:
name、string和domain。示例
<filter string="Creation Date" name="filter_create_date" date="create_date"> <filter name="create_date_last_30_days" string="Last 30 Days" domain="[('create_date', '>', datetime.datetime.combine(context_today() - relativedelta(days=30), datetime.time(23, 59, 59)).to_utc())]"/> </filter>
请注意,以这种方式定义的所有自定义筛选器彼此之间互斥,与其他子筛选器也互斥。
- 要求
可选
type- 默认
''
- end_date
用于表示记录所描述期间结束的
date或datetime字段的名称,以便按日期范围而不是单个日期进行筛选。此时,筛选器会匹配其范围与所搜索期间重叠的记录,即域
['&', (date, '<=', period_end), '|', (end_date, '>=', period_start), '&', (end_date, '=', False), (date, '>=', period_start)]。没有结束日期的记录在其开始时即结束。由于该筛选器涉及两个字段,因此应设置
string属性:否则会回退为date属性中字段的标签。示例
<filter string="Period" name="filter_period" date="date_start" end_date="date_stop"/>
- 要求
可选
type- 默认
''- 范围
date属性非空的筛选器
- default_period
基于时间的筛选器(带有
date属性)的默认期间。它必须是某个有效筛选器 id,或由逗号分隔的有效筛选器 id 列表。有效筛选器 id 包括以下内容:
first_quarter、second_quarter、third_quarter和fourth_quarter。month、month-1和month-2之一。year、year-1和year-2之一。可导航的相对期间
today、this_week、this_month、this_quarter和this_year之一。筛选器内定义的任何自定义筛选器的
name,前面加上custom_。
该筛选器必须属于视图初始化时激活的默认筛选器集合。
示例
<filter string="Creation Date" name="filter_create_date" date="create_date" default_period="year,month-1"/>
示例
<filter string="Creation Date" name="filter_create_date" date="create_date" default_period="custom_create_date_last_30_days"> <filter name="create_date_last_30_days" string="Last 30 Days" domain="[('create_date', '>', datetime.datetime.combine(context_today() - relativedelta(days=30), datetime.time(23, 59, 59)).to_utc())]"/> </filter>
- 要求
可选
type- 默认
month- 范围
date属性非空的筛选器
- invisible
元素是可见(
False)还是隐藏(True),取值为一个求值结果为布尔值的 Python 表达式。注解
invisible属性有两种用途:易用性:根据内容避免视图过于拥挤,并让用户更易阅读。
技术性:字段必须出现在视图中(隐藏即可)才能用于 Python 表达式。
示例
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/> <group invisible="fname_c != 4"> <field name="fname_c"/> <field name="fname_d"/> <group>
- 要求
可选
type- 默认
False
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- context
合并到动作的域中以生成搜索域的上下文
将上下文键
group_by的值设置为某个字段,可以定义一个在 分组依据 菜单中可用的分组。当字段类型为date或datetime时,该筛选器会在 分组依据 菜单中生成一个子菜单,其中提供以下时间间隔选项: 年、季度、月、周 和 日。示例
<filter string="Category" name="groupby_category" context="{'group_by': 'category_id'}"/> <filter string="Creation Date" name="groupby_create_date" context="{'group_by': 'create_date:week'}"/>
注解
按字段分组的
formatted_read_group结果可能会受到该字段group_expand属性的影响,从而可以在需要时显示空分组。更多信息请参阅Field。- 要求
可选
type- 默认
{}
小心
连续的筛选器(其间没有非筛选器元素分隔)会被视为按包含方式组合:它们将使用 OR 而不是通常的 AND 进行组合。
示例
<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>
显示 state 字段为 draft 或 done 的记录。
示例
<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('delay', '<', 15)]"/>
state 字段为 draft 且 delay 字段小于 15 的记录。
其渲染效果的可能结构与表示形式
<search>
<filter string="My Custom Name" domain="[('name', 'ilike', 'AAA')]"/>
<filter string="My orders" domain="[('user_id', '=', uid)]"/>
<filter string="Category" context="{'group_by': 'category_id'}"/>
</search>
|
延迟加载的筛选器选项¶
filter 元素可以内嵌一个 <field> 子元素,从而创建一个筛选器,其选项在用户展开时动态加载。此时该筛选器会在 筛选 菜单中渲染为可展开项,其选项在首次点击时获取,而不是在视图初始化时获取。
<search>
<filter string="LABEL" name="NAME">
<field name="FIELD_NAME"/>
</filter>
</search>
<field> 子元素仅支持 Selection、Many2one 和 Many2many 字段。对于关系字段,如果初始集合之外还有其他记录可用,会出现 更多… 按钮,允许用户逐步加载更多选项。
<field> 子元素接受以下属性:
- domain
用于筛选作为选项获取的记录的域。这仅适用于
Many2one和Many2many字段,对Selection字段没有影响。- 要求
可选
type- 默认
[]- 范围
<filter>的<field>子元素
选择某个选项后,生成的搜索域是 <filter> 元素的 domain 属性与所选选项的域的组合。
示例
<search>
<!-- Shows all Priority values; selecting one filters to leads only -->
<filter string="Lead Priority" name="lead_priority" domain="[('type', '=', 'lead')]">
<field name="priority"/>
</filter>
<!-- Shows only teams where the current user is team leader (field domain) -->
<!-- Selecting one also filters by assignee with the current user (filter domain)-->
<filter string="My Sales Teams" name="sales_teams_switcher" domain="[('user_id', '=', uid)]">
<field name="team_id" domain="[('user_id', '=', uid)]"/>
</filter>
</search>
separator:分隔筛选器分组¶
separator 元素用于在简单搜索视图中分隔 筛选器 分组。对于更复杂的搜索视图,建议使用 group 元素。
<search>
<FILTERS/>
<separator/>
<FILTERS/>
</search>
separator 元素不接受任何属性。
group:分隔筛选器分组¶
group 元素用于在内容繁杂的搜索视图中分隔 筛选器 分组。在较简单的搜索视图中,它可以替代 separator 元素。
<search>
<group>
<FILTERS/>
</group>
</search>
group 元素不接受任何属性。
searchpanel:显示搜索面板¶
searchpanel 元素会在多记录视图的左侧显示搜索面板。它可以根据指定字段快速筛选数据。
<search>
<searchpanel>
<FIELDS/>
</searchpanel>
</search>
searchpanel 元素仅接受 field 子元素。
用作 searchpanel 元素子元素的 field 元素可以具有以下属性:
- name
用于筛选的字段名称。
- 要求
必需
type
- string
字段的标签。
- 要求
可选
type- 默认
模型字段的
string属性
- select
字段的行为和显示方式。它可以有两个不同的值:
- one
最多只能选择一个值。支持的字段类型为
many2one和selection。
- multi
可以选择多个值。支持的字段类型为
many2one、many2many和selection。
- 要求
可选
type- 默认
one
- groups
元素向其显示的用户组列表,以逗号分隔。不属于其中至少一个用户组的用户无法看到该元素。可以为用户组加上否定运算符
!前缀,以便将其排除。示例
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- 要求
可选
type- 默认
''
- icon
字段的图标。
- 要求
可选
type- 默认
''
- color
字段的颜色。
- 要求
可选
type- 默认
''
当 field 元素设置了 select=one 属性时,还可以具有以下附加属性:
- hierarchize
子类别应显示在其父类别之下,还是显示在同一层级。
- 要求
可选
type- 默认
True- 范围
Many2one字段
- depth
如果设置为非零整数,则层级结构(如果有)将展开到指定层级。
- 要求
可选
type整数
- 默认
0- 范围
Many2one字段
当 field 元素设置了 select=multi 属性时,还可以具有以下附加属性:
- enable_counters
是否计算记录计数器,并在其非零时显示。
小技巧
提供此属性是为了避免影响性能。解决性能问题的另一种方法是重写
search_panel_select_range和search_panel_select_multi_range方法。- 要求
可选
type- 默认
False
- expand
是否显示没有记录的类别和筛选器。
- 要求
可选
type- 默认
False
- limit
为该字段获取的最大值数量。如果达到该上限,搜索面板上不会显示任何值,而是显示一条错误消息。如果设置为 0,则获取所有值。
- 要求
可选
type- 默认
200
- domain
记录必须满足的条件。
示例
<searchpanel> <field name="department_id"/> <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/> </searchpanel>
- 要求
可选
type- 默认
[]
- groupby
值应基于其进行分组的字段名称。
- 要求
可选
type- 默认
''- 范围
Many2one和Many2many字段
搜索默认值¶
搜索字段和筛选器可以通过动作的 context 使用 search_default_name 键进行配置。对于字段,值必须是要设置给该字段的值。对于筛选器,值必须是布尔值或数字。
示例
假设 foo 是一个字段、bar 是一个筛选器,以下动作上下文会在 foo 上搜索 acro,并默认启用 bar:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
可以使用数字值(介于 1 和 99 之间)来定义默认 groupby 筛选器的顺序。
示例
假设 foo 和 bar 是两个 groupby 筛选器,以下动作上下文会先启用 bar,再启用 foo。
{
'search_default_foo': 2,
'search_default_bar': 1
}
注解
延迟加载的筛选器(带有 <field> 子元素的筛选器)不能用作搜索默认值,因为它们的选项仅在用户展开时才会获取。
看板¶
看板视图用作 看板面板 可视化:它们将记录显示为“卡片”,介于 列表 和 表单 视图之间。
记录可以按列分组,以便用于工作流可视化或操作(例如任务或工作进度管理),也可以不分组(仅用于可视化记录)。
看板视图的根元素是 kanban。
其渲染效果的可能结构与表示形式
<kanban>
...
</kanban>
|
注解
看板视图最多加载并显示十列。此后的任何列都会处于关闭状态,但用户仍可将其打开。
根属性¶
可以向根元素 kanban 添加可选属性来自定义视图。
- string
视图标题。仅当您打开一个没有名称、且 target 为
new的动作(即打开对话框)时才会显示。- 要求
可选
type- 默认
''
- create
禁用/启用视图中的记录创建。
- 要求
可选
type- 默认
True
- edit
禁用/启用视图中的记录编辑。
- 要求
可选
type- 默认
True
- delete
禁用/启用通过 操作 下拉菜单删除视图中的记录。
- 要求
可选
type- 默认
True
- default_order
以逗号分隔的字段名列表,用于覆盖通过
_order属性在模型上定义的排序。要反转某个字段的排序方向,请在其后加上
desc,并以空格分隔。示例
<list default_order="sequence,name desc"> ... </list>
- 要求
可选
type- 默认
''
- class
向视图的根 HTML 元素添加 HTML 类。
- 要求
可选
type- 默认
''
- examples
在分组看板视图中创建新列时可以浏览的示例在
KanbanExamplesRegistry中的键。- 要求
可选
type- 默认
''
- group_create
是否显示 添加新列 栏。
- 要求
可选
type- 默认
True
- group_delete
是否可以通过齿轮菜单删除列。
- 要求
可选
type- 默认
True
- group_edit
是否可以通过齿轮菜单编辑列。
- 要求
可选
type- 默认
True
- groups_draggable
是否可以重新排列列的顺序。
- 要求
可选
type- 默认
True
- records_draggable
看板视图分组时是否可以拖动记录。要使用特定字段作为顺序、通过拖放来重新排列记录,请在卡片模板中对该字段使用
handle小部件。- 要求
可选
type- 默认
True
- archivable
当模型上定义了
active字段时,是否可以归档和取消归档属于某列的记录。- 要求
可选
type- 默认
True
- quick_create
是否可以在不切换到表单视图的情况下创建记录。
- 要求
可选
type- 默认
当看板视图按 many2one、selection、char 或 boolean 字段分组时为
True,否则为False
- on_create
点击 创建 时调用的自定义动作。
如果设置为
'quick_create',则改用快速创建记录。如果快速创建已被禁用,则调用标准的创建动作。- 要求
可选
type- 默认
''
- can_open
默认情况下,点击看板卡片会在表单视图中打开相应记录。可以通过将属性
can_open设置为False来禁用此行为。- 要求
可选
type- 默认
True
- highlight_color
用于为看板卡片左侧边框着色的整型字段的名称。与卡片模板中某字段上的
kanban_color_picker小部件结合使用,用户可以直接从卡片上编辑颜色。- 要求
可选
type
- card_id
其模板用于渲染看板卡片的 卡片视图 的 ID。设置后,就不再需要看板视图自身的
templates元素。这样可以在多个视图之间共享同一个卡片定义。示例
<record id="my_model_card" model="ir.ui.view"> <field name="name">my.model.card</field> <field name="model">my.model</field> <field name="arch" type="xml"> <card> <templates> <t t-name="card"> <field name="name"/> </t> </templates> </card> </field> </record> <record id="my_model_kanban" model="ir.ui.view"> <field name="name">my.model.kanban</field> <field name="model">my.model</field> <field name="arch" type="xml"> <kanban card_id="%(my_module.my_model_card)d"/> </field> </record>
- 要求
可选
typeint(视图 id)
- 默认
''
- sample
如果当前模型未找到任何记录,是否用一组示例记录填充视图。
这些虚构记录针对某些字段名/模型采用了启发式规则。例如,模型
res.users上的display_name字段会填充为示例人名,而email字段则采用firstname.lastname@sample.demo的形式。用户无法与这些数据进行交互,一旦执行动作(创建记录、添加列等),这些数据就会被丢弃。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
组件¶
看板视图接受以下子元素: templates、field、header 和 progressbar。
templates:定义卡片结构¶
templates 元素用于定义构建看板卡片结构的 QWeb 模板。或者,可以通过 card_id 根属性引用外部的 卡片视图,从而在多个视图之间共享同一个卡片视图定义。
使用内联模板时,必须至少定义一个根 card 模板。还可以定义一个 menu 模板,它将渲染为可通过卡片上的 按钮访问的下拉菜单。
示例
<kanban>
<templates>
<t t-name="card">
<field name="name"/>
</t>
<t t-name="menu">
<a t-if="widget.editable" role="menuitem" type="open" class="dropdown-item">Edit</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
</templates>
</kanban>
有关模板结构、渲染上下文、可用变量、按钮、小部件和布局的完整文档,请参阅 卡片视图。
除了所有基于卡片的视图都支持的 action 和 object 按钮类型之外,看板模板还支持 button 和 a 元素上的以下 type 值:
- open
点击该元素会在表单视图中打开卡片的记录。
- delete
点击该元素会删除卡片的记录并移除该卡片。
- archive
点击该元素会归档卡片的记录并移除该卡片。
- unarchive
点击该元素会取消归档卡片的记录并移除该卡片。
- set_cover
点击该元素可选择一张图片,将其设为该记录的封面图片。
field:声明更多需要获取的字段¶
field 元素也可以在 t-name 模板 之外 使用,但仍须位于 templates 元素内部。在这种情况下,它声明的是不在卡片中显示、但仍需获取的字段,例如因为这些字段的值被用于 t-if 条件。
示例
<kanban>
<field name="is_company"/>
<templates>
<t t-name="card">
<field name="name"/>
<field t-if="!record.is_company.raw_value" name="parent_id">
</t>
</templates>
</kanban>
progressbar:在列顶部显示进度条¶
progressbar 元素用于定义在分组看板视图的看板列顶部显示的进度条。
<kanban>
<progressbar field="FIELD_NAME"/>
...
</kanban>
progressbar 元素可以具有以下属性:
- field
进度条的各子分组所基于的字段名称。
- 要求
必需
type
- colors
进度条字段值到颜色值
muted、success、warning和danger的映射。- 要求
必需
type
- sum_field
用于在进度条旁显示的合计中所使用的字段名称。如果未设置,则改为显示记录总数。
- 要求
可选
type- 默认
''
其渲染效果的可能结构与表示形式
<kanban>
<progressbar field="activity_state"
colors="{'planned': 'success', 'today': 'warning', 'overdue': 'danger'}"
sum_field="expected_revenue"/>
<templates>
...
</templates>
</kanban>
|
control:自定义创建和删除动作¶
与 列表视图 相同。
银行卡¶
卡片视图定义用于将单条记录渲染为卡片的结构。它们是独立的视图记录,可通过 card_id 属性被 看板 和其他视图引用,从而使同一卡片模板能够在多种场景中复用(例如看板面板、甘特图弹出窗口或日历事件)。
卡片视图的根元素是 card。
<card>
<templates>
<t t-name="card">
...
</t>
</templates>
</card>
根属性¶
可以向根元素 card 添加可选属性以自定义视图。
- create
禁用/启用视图中的记录创建。
- 要求
可选
type- 默认
True
- edit
禁用/启用视图中的记录编辑。
- 要求
可选
type- 默认
True
- delete
禁用/启用通过 操作 下拉菜单删除视图中的记录。
- 要求
可选
type- 默认
True
组件¶
templates:定义卡片结构¶
templates 元素用于定义构成卡片结构的 QWeb 模板。
为清晰起见,卡片结构的定义可以拆分到多个模板中,但至少必须定义一个根 card 模板。
这些模板使用 JavaScript QWeb 编写。
<card>
<templates>
<t t-name="card">
<field name="name"/>
</t>
</templates>
</card>
警告
这些是 QWeb 模板,而不是 Owl 模板,这意味着诸如 t-on-click 之类的指令不可用。
字段¶
在这些模板内部,field 元素用于渲染字段。它可以具有以下属性:
- name
要渲染的字段名称。
- 要求
必需
type
- widget
用于表示该字段的小组件。所选小组件可以改变字段的渲染方式和/或编辑方式。它指向注册到
fields注册表中的一个 JavaScript 实现(Owl 组件)。- 要求
可选
type
默认情况下,字段节点会被替换为包含其格式化值的 span,除非指定了 widget 属性,此时它们的渲染方式和行为取决于对应的小组件。
请参阅 字段章节,了解各种小组件及其选项。
渲染上下文¶
由于卡片模板使用 QWeb 引擎 渲染,它们具有 渲染上下文,即在模板中可用的一组变量,包含有用的信息和工具。以下是可用的变量:
- record
一个包含视图中定义的所有字段的对象。每个字段有两个属性:
value和raw_value。前者按当前用户参数进行格式化,后者是原始值(例如 many2one 字段的id)。例如,该对象可用于在t-if条件中使用字段值。若用于显示,我们建议使用<field>标签。示例
<card> <field name="is_company"/> <templates> <t t-name="card"> <field name="name"/> <field t-if="!record.is_company.raw_value" name="parent_id"> </t> </templates> </card>
- widget
一个包含 2 个键的对象,用于定义用户可用的动作:
editable:如果用户可以编辑记录则为 true,否则为 false;deletable:如果用户可以删除记录则为 true,否则为 false。
这对于有条件地显示需要特定访问权限的元素很有用。
示例
<card> <templates> <t t-name="card"> <field name="name"/> </t> <t t-name="menu"> <a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a> </t> </templates> </card>
- context
当前上下文,它来自打开该视图的动作,或来自在表单视图中嵌入该视图的 one2many 或 many2many 字段。
- read_only_mode
指示该视图为只读。
type
- selection_mode
在选择 many2one 或 many2many 字段时是否打开该视图(在移动端环境中)。
type
- luxon
luxon 对象,可用于操纵日期和日期时间字段值。
- JSON
JavaScript 的 JSON 命名空间对象,其中包含
parse方法,可用于将 json 字段值解析为 JavaScript 对象。
部件¶
widget 元素允许在卡片中插入动态生成的(在 JavaScript 中)HTML。它有一个必需的 name 属性,指向注册到 view_widgets 注册表中的 JavaScript 实现(一个 Owl 组件)。
请参阅 小组件章节,了解各种小组件及其选项。
布局¶
使用标准 HTML 元素和 Bootstrap 实用类 可以轻松实现多种卡片布局。默认情况下,卡片是一个 flexbox 容器,方向为 column。
示例
<card>
<templates>
<t t-name="card">
<field class="fw-bold fs-5" name="display_name"/>
<field class="text-muted" name="parent_id"/>
<field name="tag_ids" widget="many2many_tags"/>
</t>
</templates>
</card>
footer HTML 元素的样式设置为固定在卡片底部,并且是一个方向为 row 的 flexbox 容器,便于在同一行中显示多个字段。
示例
<card>
<templates>
<t t-name="card">
<field class="fw-bold fs-5" name="display_name"/>
<field class="text-muted" name="parent_id"/>
<field name="tag_ids" widget="many2many_tags"/>
<footer>
<field name="priority" widget="priority"/> <!-- bottom left corner -->
<field class="ms-auto" name="activity_ids" widget="kanban_activity"/> <!-- bottom right corner -->
</footer>
</t>
</templates>
</card>
要在卡片侧面显示某些内容(例如图片),可以使用 aside 和 main HTML 元素,并在卡片上使用 flex-row 类名。main 节点是一个 flexbox 容器,与没有 aside 时的卡片相同。
示例
<card>
<templates>
<t t-name="card" class="flex-row">
<aside>
<field name="avatar_128" widget="image" alt="Avatar"/>
</aside>
<main class="ms-2">
<field class="fw-bold fs-5" name="display_name"/>
<field class="text-muted" name="parent_id"/>
<field name="tag_ids" widget="many2many_tags"/>
<footer>
<field name="priority" widget="priority"/>
<field class="ms-auto" name="activity_ids" widget="kanban_activity"/>
</footer>
</main>
</t>
</templates>
</card>
小技巧
在 aside 元素上设置类名 o_card_aside_full 可以移除内边距,使图片延伸到卡片边缘。
field:声明更多需要获取的字段¶
field 元素也可以在 templates 元素 之外 使用。在这种情况下,可以用它声明不在卡片中显示、但仍需获取的字段,例如因为这些字段的值被用于 t-if 条件。
示例
<card>
<field name="is_company"/>
<templates>
<t t-name="card">
<field name="name"/>
<field t-if="!record.is_company.raw_value" name="parent_id">
</t>
</templates>
</card>
QWeb¶
QWeb 视图是位于视图 arch 中的标准 QWeb 模板 模板。它们没有特定的根元素。由于 QWeb 视图没有特定的根元素,因此必须显式指定其类型(无法从 arch 字段的根元素推断)。
QWeb 视图有两种使用场景:
它们可以用作前端模板,此时应使用 template 作为快捷方式。
它们可以用作实际的 qweb 视图(在动作中打开),此时应将其定义为带有显式
type(无法推断)和模型的常规视图。
与基本的 qweb-as-template 相比,qweb-as-view 的主要新增内容有:
qweb-as-view 对带有 CSS 类
o_qweb_cp_buttons的<nav>元素有特殊处理:其内容应为按钮,这些按钮会被提取并移到控制面板的按钮区域,<nav>本身会被移除;这是针对控制面板视图尚不存在的一种变通做法qweb-as-view 渲染会向标准 qweb 渲染上下文中添加若干项:
modelqweb 视图所绑定的模型
domain搜索视图提供的域
context搜索视图提供的上下文
records指向
model.search(domain)的惰性代理,如果你只想遍历记录而不执行更复杂的操作(例如分组),则可以使用它
qweb-as-view 还提供了额外的渲染钩子:
_qweb_prepare_context(view_id, domain)准备 qweb-as-view 特有的渲染上下文qweb_render_view(view_id, domain)是由客户端调用的方法,它会调用上下文准备方法,并最终调用env['ir.qweb'].render()。
图表¶
图表视图用于可视化对若干记录或记录组的聚合结果。其根元素是 <graph>,可以接受以下属性:
type(可选)bar(默认)、pie和line之一,即要使用的图表类型stacked(可选)仅用于
bar图表。设为0可防止组内的柱状条初始时堆叠。disable_linking(可选)设为
1可防止将图表上的点击重定向到列表视图order(可选)如果设置,x 轴的值默认将按其度量并依照给定顺序(
asc或desc)排序。仅用于bar和pie图表。string(可选)重定向到列表视图时在面包屑中显示的字符串。
- sample
如果当前模型未找到任何记录,是否用一组示例记录填充视图。
这些虚构记录针对某些字段名/模型采用了启发式规则。例如,模型
res.users上的display_name字段会填充为示例人名,而email字段则采用firstname.lastname@sample.demo的形式。用户无法与这些数据进行交互,一旦执行动作(创建记录、添加列等),这些数据就会被丢弃。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
图表视图中唯一允许的元素是 field,它可以具有以下属性:
name(必填)要在视图中使用的字段名称。如果用于分组(而不是聚合)
invisible(可选)如果为 true,该字段既不会出现在可用度量中,也不会出现在可选择的度量中。
type(可选)如果设为
measure,该字段将作为组内聚合值使用,而不是作为分组条件。它仅对带有该属性的最后一个字段生效,但对带有 string 属性的其他字段很有用(见下文)。interval(可选)在日期和日期时间字段上,按指定间隔(
day、week、month、quarter或year)分组,而不是按具体的日期时间(固定秒精度)或日期(固定天精度)分组。默认为month。string(可选)仅用于带有
type="measure"的字段。用于在图表视图中显示该字段的名称,会覆盖字段默认的 python String 属性。
度量是根据模型字段自动生成的;只使用可聚合的字段。这些度量还会按字段的字符串进行字母排序。
警告
图表视图的聚合在数据库内容上执行,因此非存储的函数字段无法用于图表视图
在图表视图中,field 可以具有 widget 属性以指定其格式。该小组件应为字段格式化器,其中最有用的有 float_time 和 monetary。
<field name="working_hours_close" widget="float_time"/>
透视表¶
数据透视视图用于以 pivot table 的形式可视化聚合结果。其根元素是 <pivot>,可以接受以下属性:
disable_linking(可选)设为
1可移除表格单元格指向列表视图的链接。display_quantity(可选)设为
1可默认显示“数量”列。default_order(可选)度量名称以及顺序(asc 或 desc),用作视图中的默认排序。
<pivot default_order="foo asc"> <field name="foo" type="measure"/> </pivot>
数据透视视图中唯一允许的元素是 field,它可以具有以下属性:
name(必填)要在视图中使用的字段名称。如果用于分组(而不是聚合)
string(可选)用于在数据透视视图中显示该字段的名称,会覆盖字段默认的 python String 属性。
type(可选)指示该字段应用作分组条件还是组内聚合值。可能的值为:
row(默认)按指定字段分组,每个分组占一行。
col创建按列分组
measure要在组内聚合的字段
interval在日期和日期时间字段上,按指定间隔(
day、week、month、quarter或year)分组,而不是按具体的日期时间(固定秒精度)或日期(固定天精度)分组。
invisible(可选)如果为 true,该字段既不会出现在可用度量中,也不会出现在可选择的度量中(适用于聚合没有意义的字段,例如以不同单位表示的字段,如 € 和 $)。
- sample
如果当前模型未找到任何记录,是否用一组示例记录填充视图。
这些虚构记录针对某些字段名/模型采用了启发式规则。例如,模型
res.users上的display_name字段会填充为示例人名,而email字段则采用firstname.lastname@sample.demo的形式。用户无法与这些数据进行交互,一旦执行动作(创建记录、添加列等),这些数据就会被丢弃。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
度量是根据模型字段自动生成的;只使用可聚合的字段。这些度量还会按字段的字符串进行字母排序。
警告
与图表视图一样,数据透视视图在数据库内容上聚合数据,这意味着非存储的函数字段无法用于数据透视视图
在数据透视视图中,field 可以具有 widget 属性以指定其格式。该小组件应为字段格式化器,其中最有用的有 date、datetime、float_time 和 monetary。
例如,一个工时表数据透视视图可以定义如下:
<pivot string="Timesheet">
<field name="employee_id" type="row"/>
<field name="date" interval="month" type="col"/>
<field name="unit_amount" type="measure" widget="float_time"/>
</pivot>
日历¶
日历视图将记录显示为日、周、月或年日历中的事件。
注解
默认情况下,日历视图会以当前日期(今天)为中心。你可以将特定的初始日期传入动作的上下文,以便将日历的初始焦点设置在该日期前后的时间段(参见 mode)上(要使用的上下文键为 initial_date)
其根元素是 <calendar>。根节点上可用的属性有:
- date_start
记录中用于保存事件开始日期的字段名称。
- 要求
必需
type
- date_stop
记录中用于保存事件结束日期的字段名称。
- 要求
可选
type- 默认
date_start
- scales
可用刻度的逗号分隔列表,可选值为
day、week、month、year。默认情况下所有刻度均可用。- 要求
可选
type- 默认
"day,week,month,year"
- mode
日历的默认刻度。
- 要求
可选
type"day","week","month"or"year"- 默认
"week"
- color
用于 颜色分段 的记录字段名称。同一颜色分段中的记录在日历中会分配相同的高亮颜色。
- 要求
可选
type
- all_day
记录中布尔字段的名称,该字段指示对应事件是否被标记为全天事件,此时持续时间无关紧要。
- 要求
可选
type
- aggregate
用于在筛选侧面板中于筛选器旁显示聚合值的记录字段名称。聚合器可以显式指定(例如
aggregate="expected_revenue:sum")。如果未指定,则使用该字段的聚合器。支持的聚合器有sum、avg、min、max、count和count_distinct。- 要求
可选
type
- event_limit
限制日历单元格中显示的事件数量(在
month刻度下),以及week和day刻度下全天事件的数量。如果事件数超过该限制,则会添加一个“更多”按钮,在弹出框中显示其余事件。- 要求
可选
type- 默认
5
- show_unusual_days
若设为 true,周末和公共假日的背景将显示为灰色。
- 要求
可选
type- 默认
False
- hide_date
设为 true 可隐藏记录弹出框中的日期部分。
- 要求
可选
type- 默认
False
- hide_time
设为 true 可隐藏记录弹出框中的时间部分。
- 要求
可选
type- 默认
False
- month_overflow
默认情况下,在月模式下会显示上个月的最后几天和下个月的最初几天及其事件。此选项可禁用该行为,使这些相邻日期显示为灰色且不显示其事件。
- 要求
可选
type- 默认
True
- show_date_picker
默认情况下,侧面板中会在主日历旁显示一个小日历(月模式)。此选项允许通过将其设为
False来移除它。- 要求
可选
type- 默认
True
- schedule
若设为
True,未排期的事件(未设置开始日期和停止日期的事件)将显示在侧面板中,以便用户将这些事件拖放到日历中立即为其排期。- 要求
可选
type- 默认
False
- event_open_popup
若为 true,则在对话框中打开事件以进行编辑;否则在经典表单视图中打开。
- 要求
可选
type- 默认
False
- form_view_id
用户创建或编辑事件时要打开的视图。默认使用当前动作的表单视图(如果有)。
- 要求
可选
type
- quick_create
启用点击时的快速事件创建:仅要求用户提供
name,并尝试仅使用该名称和点击的事件时间创建新事件。如果快速创建失败,则回退到完整的表单视图。- 要求
可选
type- 默认
True
- create_name_field
记录中保存其显示名称的字段名称。通过“快速创建”机制创建记录时会使用该字段。
- 要求
可选
type- 默认
name
- quick_create_view_id
当设置了
quick_create属性且用户创建事件时要打开的表单视图 Id,用于替代仅允许指定名称的默认对话框。- 要求
可选
type
- multi_create_view
表单视图的引用。设置后,在 month 刻度下,可通过点击日历单元格或选择一片日历单元格区域来批量创建(和删除)记录。此时会为每个选中的单元格和每个生效的筛选值创建一条记录,其值取自侧面板中显示的多重创建表单视图。在删除模式下,所选单元格中显示的所有记录都会被删除。
注意:如果侧面板包含多个筛选部分,则只使用第一个,以避免组合爆炸。
- 要求
可选
type
- create
禁用/启用视图中的记录创建。
- 要求
可选
type- 默认
True
- edit
禁用/启用视图中的记录编辑。
- 要求
可选
type- 默认
True
- delete
禁用/启用视图中的记录删除。
- 要求
可选
type- 默认
True
- string
视图标题。仅当您打开一个没有名称、且 target 为
new的动作(即打开对话框)时才会显示。- 要求
可选
type- 默认
''
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
组件¶
日历视图接受两类子元素:<field> 和 弹出框。
点击记录(日历事件)时会打开一个弹出框以显示其部分字段。当视图未定义 弹出框 元素时,这些字段就是直接声明在 <calendar> 根元素下的 <field> 元素;它们会按给定顺序显示在弹出框中。
注解
默认情况下,弹出框中的字段为只读,除非对应记录可编辑(参见 edit 根属性),此时可直接在弹出框中编辑。如果 edit 动作可用,弹出框中还会显示一个 编辑 按钮,用于打开可编辑字段的表单视图。
字段节点可以具有以下属性:
- name
要渲染的字段名称。
- 要求
必需
type
- widget
用于表示该字段的小组件。所选小组件可以改变字段的渲染方式和/或编辑方式。它指向注册到
fields注册表中的一个 JavaScript 实现(Owl 组件)。- 要求
可选
type
- invisible
Python 表达式,指示该字段是否应显示。表达式中可以使用模型的其他字段,只要这些字段也在此处声明。
- 要求
可选
type- 默认
False
- options
Python 表达式,编码该字段的选项对象。特别是
icon选项,它允许以类名形式指定在弹出框中字段前显示哪个图标(例如fa fa-users)。如果未指定图标,则可设置string选项,其值将作为标签显示在字段前。- 要求
可选
type- 默认
{}
在日历架构中指定 <field> 还可通过设置 filters 属性来自定义筛选侧面板。此时还可以使用以下额外属性:
- filters
若设为 true,该字段可从日历的侧面板中用作筛选条件。
- 要求
可选
type- 默认
False
- avatar_field
仅适用于关系字段。指定关联模型上字段的名称,该字段用于在侧面板筛选中作为头像显示在字段值前面。
- 要求
可选
type
- color
指定使用哪个字段为侧面板筛选中的复选框着色。默认情况下,使用日历视图的 color 属性将事件与筛选中的值进行匹配。
- 要求
可选
type
- write_model
允许即时创建新的筛选值。给定的模型将用作这些筛选的模型。可与
write_field组合使用。- 要求
可选
type
- write_field
与
write_model组合使用,指定给定模型中用于编码筛选值的字段名称。- 要求
可选
type
- filter_field
与
write_model组合使用,指定给定模型中用于编码筛选状态(是否被勾选)的字段名称。- 要求
可选
type
popover:自定义记录的弹出框¶
要完全控制弹出框的结构,可以将单个 <popover> 元素添加为 <calendar> 根元素的直接子元素,而不依赖上述自动生成的弹出框。有关 <popover> 元素的完整结构及其 card_id 属性,请参阅 弹出框。
示例
<calendar date_start="start" date_stop="stop">
<popover>
<templates>
<t t-name="popover-header">
<field name="name"/>
</t>
<t t-name="popover-body">
<field name="partner_id"/>
</t>
<t t-name="popover-footer">
<button class="btn btn-secondary" type="object" name="my_method" string="Do something"/>
</t>
</templates>
</popover>
</calendar>
活动¶
活动视图用于显示与记录关联的活动。数据以图表形式显示,其中记录构成行,活动类型构成列。每行的第一个单元格显示一个代表相应记录的可自定义卡片(参见 templates,与 看板 非常相似)。点击其他单元格时,会显示该记录同一类型的所有活动的详细说明。
警告
活动视图仅在安装了 mail 模块时可用,并且仅适用于继承自 mail.activity.mixin 的模型。
活动视图的根元素是 <activity>,它接受以下属性:
string(必填)标题,应描述该视图
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
视图元素的可能子元素包括:
field声明用于活动 逻辑 的字段。如果该字段仅在活动视图中显示,则无需预先声明。
可能的属性包括:
name(必填)要获取的字段名称
templates定义 QWeb 模板 模板。为清晰起见,卡片定义可以拆分为多个模板,但活动视图 必须 至少定义一个根模板
activity-box,它将为每条记录渲染一次。活动视图使用基本标准的 javascript qweb,并提供以下上下文变量(更多细节请参阅 看板):
widget当前的 :js
ActivityRecord,可用于获取一些元信息。这些方法也可直接在模板上下文中使用,无需通过widget访问record一个对象,其属性为所有请求的字段。每个字段有两个属性
value和raw_value
队列¶
Enterprise feature同期群视图用于显示并理解某些数据在一段时间内的变化方式。例如,假设某企业的客户可以订阅某项服务。同期群视图随后可以显示每月的订阅总数,并研究客户离开该服务的比率(流失)。点击某个单元格时,同期群视图会重定向到一个新动作,其中只会显示该单元格时间区间内包含的记录;该动作包含一个列表视图和一个表单视图。
注解
默认情况下,同期群视图将使用动作上定义的相同列表视图和表单视图。您可以将列表视图和表单视图传入动作的上下文,以设置/覆盖将要使用的视图(要使用的上下文键为 form_view_id 和 list_view_id)
例如,以下是一个非常简单的同期群视图:
<cohort string="Subscription" date_start="date_start" date_stop="date" interval="month"/>
同期群视图的根元素是 <cohort>,它接受以下属性:
string(必填)标题,应描述该视图
date_start(必填)有效的日期或日期时间字段。视图将该字段理解为记录的开始日期
date_stop(必填)有效的日期或日期时间字段。视图将该字段理解为记录的结束日期。该字段将决定流失率。
disable_linking(可选)设为
1可阻止将同期群单元格上的点击重定向到列表视图。mode(可选)描述该模式的字符串。应为 ‘churn’ 或 ‘retention’(默认)。流失模式从 0% 开始并随时间累积,而留存模式从 100% 开始并随时间递减。
timeline(可选)描述时间线的字符串。应为 ‘backward’ 或 ‘forward’(默认)。向前的时间线将从 date_start 到 date_stop 显示数据,而向后时间线将从 date_stop 到 date_start 显示数据(当 date_start 位于未来 / 大于 date_stop 时)。
interval(可选)描述时间间隔的字符串。应为 ‘day’、’week’、’month’(默认)或 ‘year’。
measure(可选)可聚合的字段。该字段将用于计算每个单元格的值。如果未设置,同期群视图将统计出现次数。
<field>(可选)允许指定一个特定字段以便从可用度量中管理它,其主要用途是从可选度量中隐藏某个字段:
name(必填)要在此视图中使用的字段名称。
string(可选)在同期群视图中显示该字段时使用的名称,会覆盖字段默认的 python String 属性。
invisible(可选)若为 true,该字段既不会出现在活动度量中,也不会出现在可选度量中(适用于聚合后没有意义的字段,例如单位不同的字段,如 € 和 $)。如果该值为域,则该域会在当前行记录的上下文中求值;若为
True,则会在单元格上设置对应属性。widget(可选)字段显示的替代表示形式。
- sample
如果当前模型未找到任何记录,是否用一组示例记录填充视图。
这些虚构记录针对某些字段名/模型采用了启发式规则。例如,模型
res.users上的display_name字段会填充为示例人名,而email字段则采用firstname.lastname@sample.demo的形式。用户无法与这些数据进行交互,一旦执行动作(创建记录、添加列等),这些数据就会被丢弃。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
网格¶
Enterprise feature限制¶
此视图仍在开发中,可能需要扩展或更改。
仅
date列字段经过测试,selection和many2one已名义上实现并受支持,但尚未测试,datetime则完全未实现。列单元格几乎没有可配置性,且必须为数值
单元格调整默认处于禁用状态,必须进行配置才能启用
create、edit和deleteACL 元数据不会自动设置到视图根元素上,这是受fields_view_get后处理的限制(获取这些属性的视图类型是一个固定的显式列表)
架构¶
网格视图在此模块中有自己的架构和额外校验。视图架构如下:
<grid>(1)架构根元素
必填的
string属性可选的
create、edit和delete属性可选的
adjustment和adjust_name属性adjustment可以是object或action,用于指示单元格调整应通过方法调用还是动作执行来完成。adjust_name分别提供方法名称和动作 id。在两种情况下,调整参数都作为
grid_adjust上下文成员提供;在object情况下,参数还作为位置函数参数提供(位于空 id 列表之后):row_domain与被调整单元格整行匹配的域
column_field被调整单元格的列名称
column_value被调整单元格的列值
cell_field被调整单元格的度量字段
change单元格旧值与调整后值之间的差值,可能为正或为负
可选的
hide_line_total和hide_column_total属性hide_line_total设为 true 可隐藏合计行(默认 false)
hide_column_total设为 true 可隐藏合计列(默认 false)
可选的
dialog_size属性- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
可选的
barchart_total属性barchart_total设为
true可在网格底部显示基于列合计的条形图(默认 false)。
可选的
create_inline和display_empty属性create_inline设为
true可在网格底部显示一个额外的行,其中包含Add a line按钮(默认 false)。当此选项设为true时,控制面板中的Add a line按钮会被隐藏。当没有可用数据且未设置display_empty(即显示帮助内容)时,会显示控制面板中的Add a line按钮,以便用户创建第一条记录。display_empty设为
true可在没有数据时仍持续显示网格(默认 false)。当您希望用户能够跟踪当前期间时(因为日期显示在列标题中),这会很有用。提醒一下,当没有数据且未设置此属性时,将显示帮助内容而不是网格。
<button>(0+)常规 Odoo 动作按钮,显示在视图头部
必填的
string属性(按钮标签)必填的
type属性,取值为object或action注解
不支持工作流按钮
必填的
name属性,为要调用的方法名称或要执行的动作 ID可选的
context
服务器回调会获得视图中显示的所有记录 id,这些 id 或作为传递给方法的 id(
object按钮),或作为上下文的active_ids(action按钮)<field type="row">(1+)行分组字段,如果搜索视图有分组筛选,则会被其替代。
视图中
row字段的顺序决定其分组深度:如果第一个字段是school,第二个是age,则记录将先按school分组,再在每个学校内按age分组。<field type="col">(1)列分组字段。
col 字段可以包含 0 个或多个
<range>元素,用于指定可自定义的列范围。range元素具有以下必填属性name可通过
grid_range上下文值覆盖默认范围(默认为第一个)string范围按钮的标签(用户可见)
span视图中一次显示的所有列的跨度的符号名称,可能触发分页。
对于
date字段,目前有效的跨度为week和month。step一列与前一列/后一列之间步长的符号名称
对于
date字段,目前唯一有效的跨度是day。
<field type="measure">(1)单元格字段,自动汇总(由
read_group完成)。度量字段可以使用
widget属性来自定义其显示。
服务器交互¶
除可选按钮之外,网格视图目前会调用两个方法:
read_grid(由该模块在所有模型上提供)以字典形式返回网格的几乎全部内容:行标题是一个字典列表,包含以下键:
values(必填)它映射为一个字典,每个
row字段对应一个键,其值 始终 采用[value, label]的形式。domain(必填)该行来源处任意记录的域,用于在需要时于单元格调整过程中复制记录
列标题是一个字典列表,至少包含一个键:
values(必填)参见行标题中的 values
domain(必填)参见列的 domain 值
current(可选)布尔值,标记/高亮某一列
网格数据:行的列表,每行是单元格的列表,每个单元格是包含以下键的字典:
value与该单元格关联的数值
domain匹配该单元格记录的域(应视为不透明)
size该单元格中分组的记录数量
readonly(可选)一个布尔值,表示该特定单元格不应在客户端编辑
classes(可选)要添加到单元格容器(位于单元格的 TD 与单元格可能可编辑的元素之间)上的类列表(字符串形式)。
如果此列表与基础类(以
o_grid_cell_为前缀)发生冲突,则忽略此列表中的类。
请注意,网格数据是 密集 的:如果查询数据库没有得到与某个单元格匹配的分组,该单元格仍会生成一个“空”单元格,其必填键使用默认值。
prev与next,可以是假值(不启用分页),也可以是一个上下文项,合并到视图自身的上下文中以便read_grid上一页或下一页;应视为不透明
read_grid_domain(field, range)(由该模块在所有模型上提供)返回与网格当前配置的“跨度”相匹配的域。read_grid内部也会做同样的处理,但有时需要单独调用它,以便与search_count或read_group等配合使用。adjust_grid,目前尚无通用实现,其语义可能会随时间与使用场景而演变
服务器钩子¶
read_grid 会调用若干钩子,让您可以在内部自定义其操作,而无需重写整个方法:
_grid_format_cell(group, cell_field)将 read_group(逐组)的输出转换为上述格式的单元格(作为“网格数据”的一部分)
_grid_make_empty_cell(row_domain, column_domain, view_domain)生成单元格的空版本(当没有对应的分组时)
_grid_column_info(name, range)根据列类型生成一个 ColumnMetadata 对象,其中存储的值要么直接返回(作为
read_grid的一部分),要么用于查询并把read_group重新格式化为read_grid:grouping列实际使用的分组字段/查询
domain当列字段启用了分页时应用于
read_group的域,可以为空列表prev与next将发送给
read_grid的上下文片段,用于当前页之前和之后的页面。若为False,则禁用该方向上的分页values要在“当前页”显示的列值,每个值是一个字典,包含以下键:
values将整个列的字段名映射到值的字典,通常只是
name-> 一个值domain匹配该特定列的域
is_current如果当前列应在网格中被特别标出则为
True,否则为Falseformat如何将该列/该类型的值从
read_group的格式转换为read_grid的格式(对应 ColumnInfo 中的values)
ACL¶
如果视图不可编辑,则单个单元格也不可编辑
如果视图不可创建,则不会显示
Add a Line按钮(它目前会创建一条新的空记录)
上下文键¶
grid_range当视图有多个范围时,选择默认使用哪个范围
grid_anchor如果适用,用作列范围的默认锚点,替代
read_grid定义的默认值。对于日期字段,用于计算初始范围的参照日期。默认日期锚点为“今天”(采用用户所在时区)
甘特图¶
Enterprise feature甘特视图可恰当地显示甘特图(用于排程)。
甘特视图的根元素是 <gantt/>。它可以接受以下属性:
- string
字符串(默认:
'')仅当您打开一个没有名称且目标为 ‘new’(打开对话框)的动作时,才会显示该视图标题
- create
布尔值(默认:
True)禁用/启用视图中的记录创建。
- edit
布尔值(默认:
True)禁用/启用视图中的记录编辑。
- delete
布尔值(默认:
True)通过 动作 下拉菜单禁用/启用视图上的记录删除。
date_start(必填)为每条记录提供事件开始日期时间的字段名称。
date_stop(必填)为每条记录提供事件结束时间的字段名称。
dependency_field提供两条记录之间依赖关系的
many2many字段名称。如果 B 依赖 A,则dependency_field是允许从 B 获取 A 的字段。该字段与dependency_inverted_field字段都用于在药丸之间绘制依赖箭头并对其重新排程。dependency_inverted_field(如果提供了dependency_field则必填)提供与
dependency_field相反的依赖关系的many2many字段名称。如果 B 依赖 A,则dependency_inverted_field是允许从 A 获取 B 的字段。color用于根据其值为药丸着色的字段名称
decoration-{$name}求值结果为布尔值的 python expression
允许根据对应记录的属性更改单元格文本的样式。
{$name}可以是以下 bootstrap contextual color 之一(danger、info、secondary、success或warning)。根据对应记录的属性,定义记录在行文本样式中的条件显示。
这些值是 Python 表达式。对于每条记录,会以记录的属性作为上下文值对该表达式求值,如果结果为
true,则将相应样式应用到该行。以下是上下文中可用的其他一些值:uid:当前用户的 id,today:当前本地日期,为YYYY-MM-DD形式的字符串,now:与today相同,但包含当前时间。该值的格式为YYYY-MM-DD hh:mm:ss。
<gantt decoration-info="state == 'draft'" decoration-danger="state == 'help_needed'" decoration-bf="state == 'busy'"> ... </gantt>
default_group_by用于对任务分组的字段名称
disable_drag_drop如果设为 true,甘特视图将不支持任何拖放操作
create、cell_create、edit、delete、plan通过将相应属性设为
false,可以 禁用 视图中的相应动作(默认:true)。create:如果启用,控制面板中会提供Add按钮用于创建记录。cell_create:如果启用且create也已启用,将鼠标悬停在时间段单元格上时会显示一个“ +”按钮,用于在该时间段创建新记录。edit:如果启用,打开的记录将处于编辑模式(因而可编辑)。plan:如果启用且edit也已启用,时间段上会显示一个“放大镜”按钮,用于将未分配的记录排入该时间段。
示例
当您不希望在甘特视图中创建记录,而模型中开始日期和结束日期又是必填时,应禁用计划功能,因为永远不会找到任何记录。
offset取决于时间刻度,要在今天基础上增加的单位数量,用于计算默认时间段。示例:在 default_scale 为 week 时偏移 +1 会打开下一周的甘特视图,在 default_scale 为 month 时偏移 -2 会打开两个月前的甘特视图。
progress为记录的事件提供完成百分比(0 到 100 之间)的字段名称
string甘特视图的标题
precision指定各时间刻度下药丸吸附精度的 JSON 对象。
时间刻度
day的可选值有(默认:hour):hour:记录时间吸附到整点(例如 7:12 变为 8:00)hour:half:记录时间吸附到半小时(例如 7:12 变为 7:30)hour:quarter:记录时间吸附到一刻钟(例如 7:12 变为 7:15)
时间刻度
week的可选值有(默认:day:half):day:记录时间吸附到整天(例如 7:28 AM 变为前一天的 11:59:59 PM,10:32 PM 变为当天的 12:00 PM)day:half:记录时间吸附到半天(例如 7:28 AM 变为 12:00 PM)
时间刻度
month的可选值有(默认:day:half):day:记录时间吸附到整天(例如 7:28 AM 变为前一天的 11:59:59 PM,10:32 PM 变为当天的 12:00 PM)day:half:记录时间吸附到半天(例如 7:28 AM 变为 12:00 PM)
时间刻度
year始终吸附到整天。precision 属性示例:
{"day": "hour:quarter", "week": "day:half", "month": "day"}total_row布尔值,控制是否显示包含记录总数的那一行。(默认:
false)collapse_first_level布尔值,控制按单个字段分组时是否可以折叠每一行。(默认:
false,按两个字段分组时才会开始折叠)display_unavailability布尔值,用于将模型
gantt_unavailability函数返回的日期在甘特视图中标记为可用。记录仍可安排在这些日期中,但其不可用状态会以可视化方式显示。(默认:false)default_scale渲染视图时的默认时间刻度。可选值为(默认:
month):dayweekmonthyear
scales此视图允许的时间刻度列表,以逗号分隔。默认允许所有时间刻度。此列表中可用的时间刻度值请参阅
default_scale。form_view_id用户创建或编辑记录时要打开的视图。请注意,如果未设置此属性,甘特视图将回退到当前动作中表单视图的 id(如果有)。
dynamic_range如果设为 true,甘特视图将从第一条记录开始,而不是从年/月/日的开头开始。
pill_label如果设为 true,当时间刻度设为周或月时,时间会显示在药丸标签中。(例如
7:00 AM - 11:00 AM (4h) - DST Task 1)buffer_start包含要在记录开始时间之前显示的时长(以小时为单位的浮点数)的字段名称。会在主药丸旁边渲染一个独立的任务前边距。
buffer_stop包含要在记录结束时间之后显示的时长(以小时为单位的浮点数)的字段名称。会在主药丸旁边渲染一个独立的任务后边距。
thumbnails如果分组是关联字段,这允许在分组名称旁显示缩略图。它需要一个 python 字典,其键为当前模型上的字段名称。值为关联模型上存放缩略图的字段名称。
示例:任务有一个引用 res.users 的字段 user_id。res.users 模型有一个存放头像的字段 image,那么:
<gantt date_start="date_start" date_stop="date_stop" thumbnails="{'user_id': 'image_128'}" > </gantt>
按 user_id 分组时,会在用户名旁显示用户头像。
- schedule
如果设为
True,未排期的活动(开始日期和结束日期未设置的活动)会显示在侧边面板中,用户可以将这些活动拖放到甘特视图中,以便立即排期。- 要求
可选
type- 默认
False
- sample
如果当前模型未找到任何记录,是否用一组示例记录填充视图。
这些虚构记录针对某些字段名/模型采用了启发式规则。例如,模型
res.users上的display_name字段会填充为示例人名,而email字段则采用firstname.lastname@sample.demo的形式。用户无法与这些数据进行交互,一旦执行动作(创建记录、添加列等),这些数据就会被丢弃。
- 要求
可选
type- 默认
False
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
组件¶
甘特视图只接受一种子元素: 弹出框。
点击记录(甘特图中的一个药丸)时会打开弹出框,显示其部分字段。当视图未定义 弹出框 元素时,弹出框中会显示开始日期和结束日期字段。
popover:自定义记录的弹出框¶
如需完全控制弹出框的结构,可以将单个 <popover> 元素作为 <gantt> 根元素的直接子元素添加,而不依赖上文描述的自动生成的弹出框。<popover> 元素的完整结构及其 card_id 属性请参阅 弹出框。
示例
<gantt date_start="start" date_stop="stop">
<popover>
<templates>
<t t-name="popover-header">
<field name="display_name"/>
</t>
<t t-name="popover-body">
<field name="user_id"/>
<field name="stage_id"/>
</t>
<t t-name="popover-footer" replace="0">
<button name="action_custom" type="object" string="Custom Action"/>
</t>
</templates>
</popover>
</gantt>
地图¶
Enterprise feature该视图可以在地图上显示记录以及记录之间的路线。记录用标记点表示。它还允许在与记录标记点关联的弹出窗口中可视化模型中的字段。
注解
应用该视图的模型应包含一个指向 res.partner 的 many2one,因为视图依赖 res.partner 的地址和坐标字段来定位记录。
API¶
该视图使用位置数据平台的 API 来获取瓦片(地图背景)、进行地理正向解析(将地址转换为一组坐标)并获取路线。该视图实现了两种 API:OpenStreetMap 和 Mapbox。默认使用 OpenStreetMap,它能够获取 tiles 并进行 geoforwarding。该 API 不需要令牌。一旦在通用设置中提供了有效的 Mapbox 令牌,视图就会切换到 Mapbox API。该 API 速度更快,并支持计算路线。可以通过 signing up 注册 Mapbox 来获取令牌。
结构组件¶
视图的根元素是 <map>。它可以具有以下属性:
res_partner包含指向
res.partner的 many2one。如果未提供,视图将退化为创建一张空地图。default_order如果提供了字段,视图会覆盖模型的默认排序。该字段必须属于应用该视图的模型,而不是来自
res.partner。routing该属性定义出行路径的计算与显示方式。要使用路线规划,视图需要一个有效的 Mapbox 令牌以及至少两条已定位的记录(如果提供了用户位置,则只需一条)。它支持 2 个取值,也可以省略以禁用路线规划(默认:省略):
optimized:系统会计算最高效的路线,以最小化所有记录之间的总行程时间。ordered:路线严格遵循视图默认排序所定义的顺序。
hide_name为
1时,在地图标记的弹出框中隐藏名称(默认:0)。hide_address为
1时,在地图标记的弹出框中隐藏地址(默认:0)。limit最多获取的记录数(默认:
80)。它必须是正整数。
- dialog_size
当视图作为对话框打开时(例如
target="new"的动作、many2one 的“搜索更多”/“创建并编辑”,或 x2many 表单对话框),用于渲染该视图的对话框大小。当视图不在对话框内渲染时,此属性不起作用。- 要求
可选
typestr,取值为
sm、md、lg、xl、fs、fullscreen之一- 默认
''
<map> 元素接受两种子元素:<field> 和 弹出框。
点击某条记录的地图标记时,会弹出一个弹出框来显示该记录的部分字段。如果视图未定义 弹出框 元素,这些字段就是直接声明在 <map> 根元素下的 <field> 元素;每个 <field> 按给定顺序解释为弹出框中的一行。字段的属性如下:
name要显示的字段。
string在字段内容之前显示的字符串。可用作描述。
例如,以下是一个地图视图:
示例
<map res_partner="partner_id" default_order="date_begin" routing="ordered" hide_name="1">
<field name="partner_id" string="Customer Name"/>
</map>
popover:自定义记录的弹出框¶
如果希望完全控制弹出框的结构,可以将单个 <popover> 元素添加为 <map> 根元素的直接子元素,而不必依赖上文所述自动生成的弹出框。有关 <popover> 元素的完整结构及其 card_id 属性的信息,请参阅 弹出框。
示例
<map res_partner="partner_id">
<popover>
<templates>
<t t-name="popover-header">
<field name="name"/>
</t>
<t t-name="popover-body">
<field name="partner_id"/>
</t>
<t t-name="popover-footer">
<button class="btn btn-secondary" type="object" name="my_method" string="Do something"/>
</t>
</templates>
</popover>
</map>
弹出框¶
多种视图(日历、甘特图 和 地图)支持同一个 <popover> 元素,可借此自定义与其中某条记录交互时显示的弹出框(例如点击日历事件、地图标记或甘特图胶囊)。
如果希望完全控制弹出框的结构,可以将单个 <popover> 元素添加为视图根元素的直接子元素,而不必依赖根据视图字段自动生成的弹出框。各视图自身的文档会说明这种自动生成的弹出框是什么样子。
示例
<popover>
<templates>
<t t-name="popover-header">
<field name="name"/>
</t>
<t t-name="popover-body">
<field name="partner_id"/>
</t>
<t t-name="popover-footer">
<button class="btn btn-secondary" type="object" name="my_method" string="Do something"/>
</t>
</templates>
</popover>
<popover> 元素接受以下属性:
它包含一个 templates 元素,用于定义渲染弹出框所需的 QWeb 模板。这些模板可以定义如下:
popover-header如果已定义,则渲染为弹出框的页眉。默认情况下不显示页眉。
popover-body弹出框的主体内容,相当于 卡片视图 中的
card模板。如果未定义,弹出框会回退到视图自身文档中描述的默认内容;但如果提供了card_id,则改为使用所引用卡片视图的主体。popover-footer如果已定义,则替换默认页脚,默认页脚只包含一个 编辑 或 查看 按钮(标签取决于用户的访问权限)。在
<t t-name="popover-footer">节点上设置replace="0",可保留默认按钮并在其后追加自定义内容。
这些模板使用的 API 与 卡片视图模板 相同:<field> 节点、小组件、动态属性、t-if 等。渲染上下文与卡片视图完全相同。