视图¶
视图定义了记录向最终用户的展示方式。它们以 XML 编写,因此可以独立于其所表示的模型进行编辑。视图十分灵活,可以高度自定义其所控制的界面。视图有多种类型,每一种都代表一种可视化方式:form、list、kanban 等。
通用结构¶
基础视图通常共享下文定义的通用结构,占位符以全大写表示。
<record id="MODEL_view_TYPE" model="ir.ui.view">
<field name="name">NAME</field>
<field name="model">MODEL</field>
<field name="arch" type="xml">
<VIEW_TYPE>
<VIEW_SPECIFICATIONS/>
</VIEW_TYPE>
</field>
</record>
字段¶
视图对象提供了若干字段。除另有说明外,它们都是可选的。
name(必填)Char仅作为视图的助记/描述,便于在各类列表中查找视图。
modelChar视图关联的模型(如适用)。
priorityInteger当以
(model, type)请求视图时,会返回匹配该模型和类型且优先级数值最低的视图(即默认视图)。它还定义了 视图继承 期间视图的应用顺序。
groups_idMany2many->odoo.addons.base.models.res_users.Groups允许使用/访问当前视图的用户组。
若视图扩展已有视图,则仅当用户具有所提供
groups_id的访问权限时,该扩展才会对该用户生效。archText视图布局的描述。
属性¶
不同的视图类型拥有丰富的属性,可用于定制通用行为。这里介绍其中一些主要属性,它们并非对所有视图类型都生效。
Note
当前上下文和用户访问权限也可能影响视图的能力。
create在视图上禁用/启用记录创建。
edit(form&list&gantt)禁用/启用视图上的记录编辑。
delete(form&list)通过 Action 下拉菜单禁用/启用视图中的记录删除功能。
duplicate(form)通过 动作 下拉菜单启用/禁用视图上的记录复制功能。
decoration-{$name}(list&gantt)根据相应记录的属性,以行文本样式的形式定义记录的条件显示。
取值为 Python 表达式。对每条记录,表达式会以记录的属性作为上下文值进行求值,如果结果为
true,则将相应样式应用于该行。以下是上下文中可用的其他一些值:uid:当前用户的 id,today:当前本地日期,格式为YYYY-MM-DD的字符串,now:与today相同,但还包含当前时间。该值的格式为YYYY-MM-DD hh:mm:ss。
<tree decoration-info="state == 'draft'" decoration-danger="state == 'help_needed'" decoration-bf="state='busy'"> <!-- TREE_VIEW_CONTENT --> </tree>
Warning
两种视图类型支持的值不同。甘特视图仅支持
success、info、warning、danger和secondary显示样式;列表视图支持bf、it、success、info、warning、danger、muted和primary显示样式。sample(kanban&list&gantt&graph&pivot&cohort)如果当前模型没有记录,则用一组示例记录填充视图。该属性默认为 false。
这些伪记录会针对某些字段名/模型套用启发式规则。例如,’res.users’ 模型上的 ‘display_name’ 字段会被填入示例人名,而 ‘email’ 字段则呈现为 ‘firstname.lastname@sample.demo’ 的形式。
用户无法与这些数据交互,并且一旦执行某个操作(创建记录、添加列等),这些数据就会被丢弃。
banner_route需要请求的路由地址,其内容会前置添加到视图之前。若设置此属性,将获取 控制器路由 url 并显示在视图上方。控制器的 json 响应应包含 “html” 键。
如果 html 中包含样式表 <link> 标签,该标签会被移除并追加到 <head> 中。
要与后端交互,可以使用 <a type=”action”> 标签。详细信息请参阅 AbstractController 的 _onActionClicked 方法的文档(addons/web/static/src/js/views/abstract_controller.js)。
只有扩展 AbstractView 和 AbstractController 的视图才能使用此属性,如 表单、看板、列表 等…
示例:
<tree banner_route="/module_name/hello" />
class MyController(odoo.http.Controller): @http.route('/module_name/hello', auth='user', type='json') def hello(self): return { 'html': """ <div> <link href="/module_name/static/src/css/banner.css" rel="stylesheet"> <h1>hello, world</h1> </div> """ }
继承¶
继承字段¶
以下两个 View 字段用于指定被继承的视图。
inherit_idMany2one当前视图的父视图,默认未设置。使用
ref属性来指定父视图:<field name="inherit_id" ref="library.view_book_form"/>
modeSelection:extension / primary继承模式,设置了
inherit_id时默认为extension,否则为primary。在使用
inherit_id的同时需要覆盖mode的一个示例是委托继承。此时派生模型与其父模型分离,与父模型匹配的视图不会与派生模型匹配。假设你继承了与父模型关联的视图,并希望自定义派生视图以展示派生模型的数据,则该派生视图的mode需要设置为primary,因为它是该派生模型的基础(也可能是唯一)视图。否则 视图匹配 规则将不适用。
视图匹配¶
如果以
(model, type)请求视图,则匹配模型和类型正确、mode=primary且优先级最低的视图。当以
id请求视图时,如果其模式不是primary,则匹配其模式为primary的 最近 父视图。
视图解析¶
解析过程会为请求/匹配到的 primary 视图生成最终的 arch:
如果视图有父视图,则先完整解析父视图,再应用当前视图的继承声明
如果视图没有父视图,则直接使用其
arch查找当前视图中模式为
extension的子视图,并以深度优先方式应用它们的继承声明(先应用子视图,再应用其子视图,然后应用其同级视图)
应用子视图的结果即为最终的 arch
继承规范¶
继承规格由元素定位器和子元素组成:定位器用于在父视图中匹配被继承的元素,子元素用于修改被继承的元素。
用于匹配目标元素的元素定位器共有三种类型:
带有
expr属性的xpath元素。expr是应用于当前arch的 XPath 表达式1,其找到的第一个节点即为匹配节点带有
name属性的field元素,匹配第一个具有相同name的field;匹配时会忽略其他所有属性其他任意元素:匹配第一个名称相同且属性完全一致的元素(忽略
position和version属性)
<xpath expr="page[@name='pg']/group[@name='gp']/field" position="inside">
<field name="description"/>
</xpath>
<field name="res_id" position="after"/>
<div name="name" position="replace">
<div name="name2">
<field name="name2"/>
</div>
</div>
继承规格可以带有可选的 position 属性,用于指定如何修改匹配到的节点:
inside(默认)继承声明的内容会被追加到匹配节点上
replace继承声明的内容会替换匹配节点。声明内容中任何仅包含
$0的文本节点都会被匹配节点的完整副本替换,从而把匹配节点包裹起来。after继承声明的内容会被添加到匹配节点的父节点中,位于匹配节点之后
before继承声明的内容会被添加到匹配节点的父节点中,位于匹配节点之前
attributes继承声明的内容应为带有
name属性以及可选内容体的attribute元素:如果
attribute元素有内容,则在匹配到的节点上创建一个以其name命名的新属性,其值为该attribute元素的文本如果
attribute元素没有内容,则匹配节点上以其name命名的属性会被移除。若不存在该属性,则抛出错误如果
attribute元素带有add属性、remove属性或两者都有,则重新计算匹配节点上以name命名的属性值,使其包含add的值(以separator分隔)并删除remove的值(以separator分隔)。如果未提供separator,则使用,作为分隔符。
<field name="sale_information" position="attributes"> <attribute name="invisible">0</attribute> <attribute name="attrs"> {'invisible': [('sale_ok', '=', False)], 'readonly': [('editable', '=', False)]} </attribute> <attribute name="class" add="mt-1 mb-1" remove="mt-2 mb-2" separator=" "/> </field>
move可作为继承声明的直接子元素使用,配合取值为
inside、replace、after或before的position属性来移动节点。<xpath expr="//@target" position="after"> <xpath expr="//@node" position="move"/> </xpath> <field name="target_field" position="after"> <field name="my_field" position="move"/> </field>
视图的规格(specs)按顺序依次应用。
- 1
为简化 QWeb 视图中的匹配,额外提供了一个扩展函数:当上下文节点包含所有指定类时
hasclass(*classes)即匹配成功
模型通用部分¶
属性¶
方法¶
视图类型¶
活动¶
活动视图用于展示与记录关联的活动。数据以图表形式展示:记录构成行,活动类型构成列。每行第一个单元格显示一个代表对应记录的卡片(可定制,参见 templates,与 看板 类似)。点击其他单元格时,会显示该记录同类型所有活动的详细描述。
Warning
活动视图仅在安装了 mail 模块时可用,且仅适用于继承自 mail.activity.mixin 的模型。
活动视图的根元素为 <activity>,它接受以下属性:
string必填)一个标题,应当描述该视图
视图元素可能的子元素有:
field声明要在活动 logic (逻辑)中使用的字段。如果字段只是在活动视图中显示,则无需预先声明。
可能的属性有:
name必填)要获取的字段名称
templates定义 QWeb 模板 模板。为清晰起见,卡片的定义可以拆分为多个模板,但活动视图 必须 定义至少一个根模板
activity-box,该模板将为每条记录渲染一次。活动视图使用大体标准的 javascript qweb,并提供以下上下文变量(参见 看板 了解详情):
widget当前的 JavaScript 类
ActivityRecord,可用于获取一些元信息。这些方法也可以直接在模板上下文中使用,无需通过widget访问record一个以所有请求的字段为属性的对象。每个字段都有
value和raw_value两个属性
日历¶
日历视图将记录作为事件显示在日、周、月或年的日历中。
Note
默认情况下,日历视图将以当前日期(今天)为中心。你可以向动作的上下文传入一个特定的初始日期,以便将日历的初始焦点设为该日期前后的时间段(参见 mode)(使用的上下文键为 initial_date)
其根元素为 <calendar>。日历视图可用的属性有:
date_start必填)保存事件开始日期的记录字段名称
date_stop保存事件结束日期的记录字段名称;如果提供了
date_stop,记录即可直接在日历中拖动(通过拖放)date_delaydate_stop的替代方案,提供事件的持续时间而非结束日期(单位:天)color用于 color segmentation (颜色分段)的记录字段名称。同一颜色分段中的记录在日历中被分配相同的高亮颜色,颜色的分配是半随机的。在侧边栏中显示可见记录的 display_name/头像
form_view_id用户创建或编辑事件时打开的视图。注意,如果未设置该属性,日历视图将回退到当前动作中的表单视图 id(如果有的话)。
event_open_popup如果选项 ‘event_open_popup’ 设置为 true,日历视图将在 FormViewDialog 中打开事件(或记录)。否则,它将在新的表单视图中打开事件(通过 do_action)
quick_add启用点击快速创建事件:仅要求用户输入
name该值保存到的字段可通过rec_name控制),并尝试仅凭该名称和所点击的事件时间创建新事件。如果快速创建失败,则回退到完整的表单对话框create_name_field保存记录文本表示的记录字段名称,在通过“快速创建”机制创建记录时使用
all_day记录上的布尔字段名称,指示相应事件是否被标记为全天事件(此时持续时间无关紧要)
mode加载日历时的默认显示模式。可能的取值为:
day、week、month、yearscales以逗号分隔的可用时间刻度列表。默认情况下,所有刻度均可用。可能的刻度值参见 mode。
create,delete通过将相应属性设置为
false,可在视图中禁用对应的操作<field>声明要聚合的字段或要在 kanban logic (逻辑)中使用的字段。如果字段只是简单地显示在日历卡片中。
字段可以具有其他属性:
invisible使用 “True” 在卡片中隐藏该值
avatar_field仅用于 x2many 字段,以便在卡片中显示头像而不是 display_name
write_model、write_field和filter_field你可以添加筛选器并将结果保存到所定义的模型中,该筛选器会添加到侧边栏。
filter_field是可选的,用于指定保存筛选器状态的字段。filters和color使用 “True” 将该字段添加到侧边栏的筛选器中。你可以指定一个
color字段,用于给复选框着色。
同期群¶
Enterprise feature同期群视图用于显示和理解某些数据随时间变化的方式。例如,假设某个企业的客户可以订阅某项服务,同期群视图就可以显示每个月的订阅总数,并研究客户流失率(churn)。点击单元格时,同期群视图会将你重定向到一个新的动作,在该动作中你只能看到该单元格时间区间内包含的记录;该动作包含一个列表视图和一个表单视图。
Note
默认情况下,同期群视图将使用动作中定义的相同列表视图和表单视图。你可以向动作的上下文传入一个列表视图和一个表单视图,以设置/覆盖将要使用的视图(使用的上下文键为 form_view_id 和 list_view_id)
例如,下面是一个非常简单的同期群视图:
<cohort string="Subscription" date_start="date_start" date_stop="date" interval="month"/>
同期群视图的根元素为 <cohort>,它接受以下属性:
string必填)一个标题,应当描述该视图
date_start必填)一个有效的 date 或 datetime 字段。该视图将此字段理解为记录的开始日期
date_stop必填)一个有效的 date 或 datetime 字段。该视图将此字段理解为记录的结束日期。此字段将决定流失率(churn)。
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,该字段既不会出现在激活的度量项中,也不会出现在可选择的度量项中(适用于聚合后没有意义的字段,例如单位不同的字段,如 € 和 $)。
表单¶
表单视图用于展示单条记录的数据,其根元素为 <form>。表单视图由常规 HTML 及额外的结构与语义组件构成。
结构组件¶
结构组件提供结构或“视觉”特性,几乎不含逻辑。它们在表单视图中作为元素或元素集合使用。
notebook定义一个选项卡区域。每个选项卡通过
page子元素定义。page 可以有以下属性:string(必填)选项卡的标题
accesskeyHTML 的 accesskey 属性
attrs基于记录值的标准动态属性
Note
注意,
notebook不应放置在group之内group用于定义表单中的列布局。默认情况下,分组定义 2 列,且分组的大多数直接子元素占据单列。作为分组直接子元素的
field默认会显示标签,标签与字段本身的 colspan 均为 1。group中的列数可通过col属性定制,单个元素占据的列数可通过colspan定制。子元素水平排列(先填满下一列再换行)。
分组可以具有
string属性,显示为分组标题newline仅在
group元素内才有用,会提前结束当前行并立即切换到新行(不会先填充剩余的列)separator较小的水平间距,带有
string属性时表现为章节标题sheet可作为
form的直接子元素使用,以实现更窄且更具响应性的表单布局header与
sheet配合使用,在表单主体自身之上提供一个全宽区域,通常用于显示流程按钮和状态组件
语义组件¶
语义组件与 Odoo 系统衔接并支持与之交互。可用的语义组件有:
button调用 Odoo 系统,与 列表视图按钮 类似。此外还可以指定以下属性:
special对于在对话框中打开的表单视图:
save保存记录并关闭对话框,cancel关闭对话框但不保存。confirm在执行按钮的 Odoo 调用之前显示并等待用户确认的提示信息(在看板视图中同样有效)。
field渲染当前记录的单个字段(并且可能允许编辑)。支持在表单视图中多次使用同一个字段,且这些字段可以为修饰符 ‘invisible’ 和 ‘readonly’ 设置不同的值。但是,当存在多个字段且其修饰符 ‘required’ 的取值不同时,行为无法得到保证。字段节点可用的属性有:
name(必填)要渲染的字段名称
id节点 id。当视图中同一字段出现多次时很有用(参见下文的
label组件)。默认为字段名称。widget字段会根据其类型采用默认的渲染方式(例如
Char、Many2one)。widget属性允许使用不同的渲染方式和上下文。options指定字段组件(包括默认组件)配置选项的 JSON 对象
class设置在生成元素上的 HTML 类,常见字段类有:
oe_inline阻止字段后的默认换行,并限制其跨度。
oe_left,oe_right使字段按对应方向浮动
oe_read_only,oe_edit_only仅在对应的表单模式下显示该字段
oe_avatar对于图片字段,将图片以“头像”形式显示(正方形,最大尺寸 90x90,带有一些图片修饰效果)
groups仅对特定用户显示该字段
on_change当该字段的值被编辑时调用指定方法,可用于更新其他字段或向用户显示警告
Deprecated since version 8.0: Use
odoo.api.onchange()on the modelattrs根据记录值动态生效的元参数
domain仅适用于关系字段:显示现有记录以供选择时要应用的筛选器
context仅适用于关系字段:获取可选值时要传递的上下文
readonly在只读模式和编辑模式下都显示该字段,但绝不使其可编辑
required如果字段没有值,则生成错误并阻止保存该记录
nolabel不自动显示字段的标签,仅当字段是
group元素的直接子元素时才有意义placeholder在 空 字段中显示的帮助信息。在复杂表单中可以替代字段标签。不应 是数据示例,因为用户容易把占位文本与已填写的字段混淆
mode对于
One2many:该字段关联记录所使用的显示模式(视图类型),取值为tree、form、kanban或graph之一。默认为tree(列表显示)help当用户悬停在字段或其标签上时显示的工具提示
filename对于二进制字段,提供文件名称的相关字段的名称
password表示某个
Char字段存储的是密码,其数据不应被显示kanban_view_ref用于在移动端环境中从 m2o/m2m 字段选择记录时打开指定的看板视图
label当
field组件没有直接放在group内,或其nolabel属性被设置时,字段的标签不会随其取值自动显示。label组件是手动显示字段标签的替代方式。可用的属性有:for(必填)与该标签所关联字段的引用。可以是字段的名称,也可以是其 id(设置在
field上的id属性)。当视图中同一字段出现多次,并且有多个label组件与这些field节点关联时,这些标签必须具有唯一的for属性(此时引用的是对应field节点的id属性)。string要显示的标签。默认显示字段的标签(来自模型中的字段定义)。
class与
field组件相同。attrs与
field组件相同。
通用结构¶
<form>
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box">
<BUTTONS/>
</div>
<group>
<group>
<field name="fname"/>
</group>
</group>
<notebook>
<page string="Page1">
<group>
<CONTENT/>
</group>
</page>
<page string="Page2">
<group>
<CONTENT/>
</group>
</page>
</notebook>
</sheet>
</form>
甘特图¶
Enterprise feature甘特图视图用于恰当地显示甘特图(用于排程)。
甘特视图的根元素是 <gantt/>,它没有子元素,但可以接受以下属性:
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 表达式。对每条记录,表达式会以记录的属性作为上下文值进行求值,如果结果为
true,则将相应样式应用于该行。以下是上下文中可用的其他一些值:uid:当前用户的 id,today:当前本地日期,格式为YYYY-MM-DD的字符串,now:与today相同,但还包含当前时间。该值的格式为YYYY-MM-DD hh:mm:ss。
{$name}可以是以下 bootstrap contextual color 之一(danger、info、secondary、success或warning)。default_group_by用于对任务分组的字段名称
disable_drag_drop如果设为 true,甘特视图将不支持任何拖放操作
consolidation用于在记录单元格中显示汇总值的字段名称
consolidation_max以”分组”字段为键的字典,值为在单元格显示为红色之前可达到的最大汇总值(例如
{"user_id": 100})consolidation_exclude指明任务是否应从汇总中排除的字段名称;如果设为 true,汇总行中会显示一个条纹区域
create,cell_create,edit,delete,plan通过将相应属性设为
false默认:true),在视图中 禁用对应操作。create:如果启用,控制面板中将提供Add按钮用于创建记录。cell_create:如果启用且create已启用,悬停在时间槽单元格上时会显示 “+” 按钮,用于在该时间槽上创建新记录。edit:如果启用,打开的记录将处于编辑模式(因而可编辑)。plan:如果启用且edit已启用,时间槽上会显示 “放大镜” 按钮,用于将未指派的记录计划到该时间槽中。
Example
当您不希望在甘特视图中创建记录,且模型上的开始和结束日期均为必填时,应禁用计划功能,因为永远找不到任何记录。
offset根据刻度不同,为计算默认周期而在今天基础上增加的单位数。例如:default_scale 为周时偏移量为 +1 将打开下周的甘特视图,default_scale 为月时偏移量为 -2 将打开两个月前的甘特视图。
progress为记录的事件提供完成百分比的字段名称,取值介于 0 到 100 之间
string甘特视图的标题
precisionJSON 对象,用于指定各刻度下条形块的吸附精度。
刻度
day的可能取值为(默认:hour):hour:记录时间吸附到整点小时(例如:7:12 变为 8:00)hour:half:记录时间吸附到半点(例如:7:12 变为 7:30)hour:quarter:记录时间吸附到半小时(例如:7:12 变为 7:15)
刻度
week的可能取值为(默认:day:half):day:记录时间吸附到整天(例如:上午 7:28 变为前一天晚上 11:59:59,晚上 10:32 变为当天中午 12:00)day:half:记录时间吸附到半小时(例如:上午 7:28 变为中午 12:00)
刻度
month的可能取值为(默认:day:half):day:记录时间吸附到整天(例如:上午 7:28 变为前一天晚上 11:59:59,晚上 10:32 变为当天中午 12:00)day:half:记录时间吸附到半小时(例如:上午 7:28 变为中午 12:00)
刻度
year始终吸附到整天。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。templates定义 QWeb 模板 模板
gantt-popover,当用户悬停在甘特视图中的某条记录上时将使用该模板。甘特视图使用基本标准的 javascript qweb,并提供以下上下文变量:
widget当前的
GanttRow实例,可用于获取一些元信息。用于转换为颜色整数的getColor方法也可直接在模板上下文中使用,无需借助widget。on_create如果指定了该属性,点击视图上的添加按钮时将启动一个客户端动作,而不是打开通用对话框。其值应为该动作的 xmlid(例如:
on_create="%(my_module.my_wizard)d"
form_view_id用户创建或编辑记录时打开的视图。注意,如果未设置该属性,甘特视图将回退到当前动作中的表单视图 id(如有)。
dynamic_range如果设为 true,甘特视图将从第一条记录开始,而不是从年/月/日的起点开始。
pill_label如果设为 true,当刻度为周或月时,时间会显示在条形块标签中。(例如:
7:00 AM - 11:00 AM (4h) - DST Task 1)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 分组时,将在用户名称旁边显示用户头像。
图表¶
图表视图用于可视化多条记录或记录组的聚合。其根元素为 <graph>,可以带有以下属性:
type可选)bar默认)、pie和line之一,即要使用的图表类型stacked可选)仅用于
bar图表。设为0可防止组内的条形在初始时堆叠。disable_linking可选)设为
1可防止点击图表时跳转到列表视图order可选)如果设置,x 轴值默认将按给定顺序(
asc或desc)根据其度量值排序。仅用于bar和pie图表。string可选)跳转到列表视图时在面包屑中显示的字符串。
图表视图中唯一允许的元素是 field,它可以具有以下属性:
name(必填)视图中使用的字段名称。如果用于分组(而非聚合)
invisible可选)如果为 true,该字段将不会出现在活动度量中,也不会出现在可选度量中。
type可选)如果设置为
measure,该字段将用作组内的聚合值,而不是分组条件。它仅对具有该属性的最后一个字段生效,但对其他带 string 属性的字段也很有用(见下文)。interval可选)在 date 和 datetime 字段上,按指定的时间间隔(
day、week、month、quarter或year)分组,而不是按具体的 datetime(固定到秒)或 date(固定到天)分组。默认值为month。string可选)仅用于
type="measure"的字段。该名称将用于在图形视图中显示字段,会覆盖字段默认的 python String 属性。
度量项自动由模型字段生成;仅使用可聚合的字段。这些度量项还会按字段的 string 属性按字母顺序排序。
Warning
图形视图的聚合基于数据库内容执行,未存储的计算字段(function 字段)不能用于图形视图
网格¶
Enterprise feature限制¶
此视图仍在开发中,可能需要扩展或调整。
目前仅测试了
date列字段;selection和many2one名义上已实现并支持,但尚未经过测试;datetime则完全未实现。列单元格几乎无法配置,且必须为数值类型
单元格调整默认禁用,必须经过配置才能启用
由于
fields_view_get后处理的限制,视图根节点不会自动设置create、edit和deleteACL 元数据(只有固定明确列表中的视图类型才会获得这些属性)
结构¶
网格视图在该模块中有自己的结构定义和额外的验证。视图架构如下:
<grid>(1)架构根元素
必填的
string属性可选的
create、edit和delete属性可选的
adjustment和adjust_name属性adjustment可为object或action,用于指示单元格调整应通过方法调用还是动作执行来完成。adjust_name分别提供方法名和动作 ID。两种情况下,调整参数都会作为
grid_adjust上下文成员提供;在object的情况下,参数还会作为位置函数参数提供(与一个空的 id 列表一起):row_domain与所调整单元格所在整行匹配的域
column_field所调整单元格对应列的名称
column_value所调整单元格对应列的值
cell_field所调整单元格的度量字段
change单元格旧值与调整后新值之间的差值,可为正数或负数
可选的
hide_line_total和hide_column_total属性hide_line_total设为 true 以隐藏总计行(默认为 false)
hide_column_total设为 true 以隐藏总计列(默认为 false)
可选的
barchart_total属性barchart_total设为
true以在网格底部显示基于各列总计的柱状图(默认为 false)。
可选的
create_inline和display_empty属性create_inline设为
true以在网格底部显示带有Add a line按钮的附加行(默认为 false)。设置此选项后,控制面板中的Add a line按钮将被隐藏。当没有数据且未设置display_empty时(即显示帮助内容时),控制面板中的Add a line按钮会显示出来,以便用户创建第一条记录。display_empty设为
true以便在没有数据时仍显示网格(默认为 false)。当您希望用户能够跟踪当前期间时,此选项很有用(因为日期显示在列标题中)。提醒一下,当没有数据且未设置此属性时,将显示帮助内容而不是网格。
<button>(0+)常规的 Odoo 动作按钮,显示在视图标题区
必填的
string属性(按钮标签)必填的
type属性,可为object或actionNote
不支持工作流按钮
必填的
name属性,为要调用的方法名或要执行的动作 ID可选的
context
服务器回调会收到视图中显示的所有记录 id,或作为传给方法的 ids(
object按钮),或作为上下文中的active_idsaction按钮)<field type="row">(1+)行分组字段,如果搜索视图有分组过滤器,将被其替换。
视图中
row字段的顺序决定了分组层级:如果第一个字段是school,第二个是age,记录将先按school分组,再在每个学校内按age分组。<field type="col">(1)列分组字段。
列字段可包含 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定义的默认值。对于日期字段,它是用于计算初始跨度的参考日期。默认的日期锚点为”今天”(按用户所在时区)
看板¶
看板视图是 kanban board 的可视化形式:以 “卡片” 展示记录,介于 列表视图 与不可编辑的 表单视图 之间。记录可以分组到列中,用于工作流的可视化或操作(如任务或工作进度管理),也可以不分组(仅用于展示记录)。
Note
看板视图最多加载并显示十列,其后的列会保持收起状态(但用户仍可手动展开)。
看板视图的根元素为 <kanban>,可以使用以下属性:
default_group_by指示当动作或当前搜索未指定分组时,看板视图是否应当分组。在没有其他分组指定时,其值应为要分组的字段名称
default_order当用户尚未(通过列表视图)对记录排序时所使用的卡片排序方式
class为看板视图的根 HTML 元素添加 HTML 类
examples如果设置为 KanbanExamplesRegistry 中的某个键,分组看板视图中就会提供列配置的示例。这里 给出了定义这些配置的方法示例。
group_create指示“添加新列”栏是否可见。默认:true。
group_delete指示分组是否可以通过上下文菜单删除。默认:true。
group_edit指示分组是否可以通过上下文菜单编辑。默认:true。
archivable指示当模型上定义了
active字段时,某列所属的记录是否可以归档 / 恢复。默认:true。quick_create指示是否可以在不切换到表单视图的情况下创建记录。默认情况下,当看板视图按 many2one、selection、char 或 boolean 字段分组时
quick_create处于启用状态,否则禁用。quick_create_viewform视图引用,用于指定快速创建记录时使用的视图。records_draggable指示看板分组时是否可以拖动记录。默认:true。
设置为
true表示始终启用,设置为false表示始终禁用。groups_draggable指示看板分组时是否可以重新排列各列的顺序。默认:true。
设置为
true表示始终启用,设置为false表示始终禁用。
视图元素可能的子元素有:
field声明用于看板 逻辑 的字段。如果字段只是在看板视图中显示,则无需预先声明。
可能的属性有:
name必填)要获取的字段名称
allow_group_range_value(可选)指示
date或datetime字段是否允许使用根据分组范围(即该分组的首个与末个日期)计算出的值。当看板视图按该字段分组时,可启用“快速创建”和“拖放”功能。默认:false。
progressbar声明一个进度条元素,放置在看板列的顶部。
可能的属性有:
field(必填)其取值用于在进度条中对列内记录再次分组的字段名称
colors(必填)将上述字段值映射为 “danger”、”warning”、”success” 或 “muted” 颜色的 JSON
sum_field(可选)该字段的列内记录值将被求和并显示在进度条旁边(省略时显示记录总数)
templates定义一组 QWeb 模板 模板。为了让定义更清晰,卡片的定义可以拆分为多个模板,但看板视图 必须 至少定义一个根模板
kanban-box,它会为每条记录渲染一次。看板视图使用大体标准的 javascript qweb,并提供以下上下文变量:
widget当前的
KanbanRecord(),可用于获取一些元信息。这些方法也可以直接在模板上下文中调用,无需通过widget访问record一个对象,其属性为所有请求的字段。每个字段都有
value和raw_value两个属性,前者按当前用户的参数格式化,后者是read()的直接返回值(date 和 datetime 字段除外,它们 按用户的区域设置格式化)context当前上下文,来自动作;若看板视图嵌入在表单视图中,还包括相应的 one2many 或 many2many 字段
user_context顾名思义
read_only_mode顾名思义
selection_mode当在移动端环境中通过 m2o/m2m 字段打开看板视图以选择记录时设为 true。
Note
在移动端环境中点击 m2o/m2m 字段会打开看板视图
按钮与字段
虽然大多数看板模板都是标准的 QWeb 模板,但看板视图会对
field、button和a元素进行特殊处理:默认情况下字段会被替换为其格式化值,除非指定了
widget属性,此时其渲染方式和行为取决于对应的组件。可选值包括(但不限于):handle对于用于记录排序的
sequence(或integer)字段,允许通过拖放记录来重新排序。
带有
type属性的按钮和链接会执行 Odoo 相关操作,而非其标准 HTML 功能。可用的类型有:action,object适用于 Odoo 按钮 的标准行为,可使用大多数与标准 Odoo 按钮相关的属性。
open以只读模式在表单视图中打开该卡片的记录
edit以编辑模式在表单视图中打开该卡片的记录
delete删除该卡片的记录并移除该卡片
如需扩展看板视图,请参阅 KanbanRecord()。
列表¶
列表视图的根元素为 <tree>2。列表视图的根元素可以具有以下属性:
editable默认情况下,选中列表视图中的某一行会打开对应的 表单视图。
editable属性使列表视图本身可以就地编辑。有效值为
top和bottom,分别让 新 记录出现在列表的顶部或底部。内联 表单视图 的结构继承自列表视图。因此,在 表单视图 的字段和按钮上有效的大多数属性也能被列表视图接受,只是当列表视图不可编辑时,它们可能没有任何含义
Note
如果
edit属性设置为false,则editable选项会被忽略。multi_edit可编辑或不可编辑的列表都可以通过定义
multi_edit=1来启用多人编辑功能。default_order覆盖视图的排序方式,取代模型的排序(即模型的
_order属性)。值为以逗号分隔的字段列表,若要反向排序则在字段后附加desc:<tree default_order="sequence,name desc"> ... </tree>
decoration-{$name}允许根据相应记录的属性更改行文本的样式。
{$name}可以是bf(font-weight: bold)、it(font-style: italic),或任意 bootstrap contextual color 颜色(danger、info、muted、primary、success或warning)。create,edit,delete,import,export_xlsx允许通过将对应属性设置为
false来在视图中 禁用 相应的操作limit每页的默认大小。必须为正整数
groups_limit当列表视图分组时,每页的默认分组数量。必须为正整数
expand当列表视图分组时,若设为 true 则自动展开第一级分组(默认:false)
列表视图可能的子元素有:
button在列表单元格中显示一个按钮
icon用于显示该按钮的图标
string如果不存在
icon,则为按钮的文本如果存在
icon,则为该图标提供alt文本
type按钮类型,指示点击该按钮时对 Odoo 的影响:
object调用列表所属模型上的方法。按钮的
name即为方法名,调用时会传入当前行的记录 id 和当前上下文。action加载并执行一个
ir.actions,按钮的name即为该动作的数据库 id。上下文会扩展加入列表所属模型(作为active_model)、当前行的记录(active_id)以及列表中当前加载的全部记录(active_ids,可能只是与当前搜索匹配的数据库记录的一部分)
name参见
typeargs参见
typeattrs根据记录值动态生效的属性。
属性到域的映射;域会在当前行记录的上下文中求值,若为
True,则会在单元格上设置相应属性。可用属性为
invisible(用于隐藏按钮)。statesinvisibleattrs的简写形式:以逗号分隔的状态列表,要求模型具有state字段并且该字段在视图中被使用。若记录 不 处于所列状态之一,则使按钮
invisibleDanger
将
states与attrs组合使用可能导致意外结果,因为域会以逻辑 AND 方式组合。context在执行按钮的 Odoo 调用时合并到视图的上下文中
field定义一列,用于为每条记录显示对应的字段。可使用以下属性:
name在当前模型中要显示的字段名称。同一个名称在每个视图中只能使用一次
string该字段所在列的标题(默认使用模型字段的
string)invisible获取并存储该字段,但不在表格中显示该列。对于不应显示、却被例如
@colors使用的字段而言是必需的groups列出应能看到该字段的用户组
widget字段显示的替代呈现方式。列表视图的可选值包括(但不限于):
progressbar将
float字段显示为进度条。handle对于用于记录排序的
sequence(或integer)字段,不显示字段的值,而是显示一个拖放图标以重新排列记录。
sum,avg在列的底部显示相应的汇总值。汇总仅在 当前显示 的记录上计算。汇总操作必须与对应字段的
group_operator一致attrs根据记录值动态生效的属性。只影响当前字段,例如
invisible会隐藏该字段,但其他记录的同一字段仍然可见,也不会隐藏整列width(用于editable)当列表中没有数据时,可以通过该属性强制指定列宽。取值可以是绝对宽度(例如 ‘100px’),也可以是相对权重(例如 ‘3’,表示该列比其他列宽 3 倍)。请注意,当列表中有记录时,会让浏览器根据内容自动调整列宽,因此该属性会被忽略。
decoration-{$name}允许根据相应记录的属性更改单元格文本的样式。
{$name}可以是bf(font-weight: bold)、it(font-style: italic),或任意 bootstrap contextual color 颜色(danger、info、muted、primary、success或warning)。nolabel如果设置为 “1”,列标题将保持为空。此外,该列也无法排序。
optional使该列变为可选。设为 “hide” 时该列默认隐藏;设为 “show” 时该列默认显示。用户的可见性选择会存储在浏览器本地存储中。
Note
如果列表视图是
editable的,则 表单视图 中的任意字段属性都有效,并在设置内联表单视图时使用。Note
对于列表子视图(在表单视图中显示 One2many/Many2many),
column_invisible属性可以根据父对象隐藏某一列。<field name="product_is_late" attrs="{'column_invisible': [('parent.has_late_products', '=', False)]}"/>
Note
当列表视图被分组时,数值字段会按组汇总并显示。此外,如果某个分组中的记录过多,分组行的右侧会出现一个分页器。因此,当列表视图处于可能被分组的情形时,最好不要把数值字段放在最后一列(不过表单视图中的 x2many 字段没有问题,因为它们无法分组)。
groupby当按 many2one 字段对记录分组时,为当前视图定义带按钮的自定义分组头。也可以在
groupby内部添加field,供修饰符使用。这些字段因此属于 many2one 的 comodel,并会被批量获取。namemany2one 字段的名称(在当前模型上)。当按该字段对视图分组时,会显示自定义分组头。
<groupby name="partner_id"> <field name="name"/> <!-- name of partner_id --> <button type="edit" name="edit" string="Edit"/> <button type="object" name="my_method" string="Button1" attrs="{'invisible': [('name', '=', 'Georges')]}"/> </groupby>
可以定义特殊按钮(
type="edit")来打开 many2one 表单视图。control为当前视图定义自定义控件。
只有当父级
tree视图位于 One2many 字段内时,这样做才有意义。不支持任何属性,但可以有子元素:
create在当前列表上添加一个用于创建新元素的按钮。
Note
若定义了任意
create,将覆盖默认的 “add a line” 按钮。支持以下属性:
string(必填)按钮上显示的文本。
context在获取新记录的默认值时,该上下文会与现有上下文合并。
例如,可用于覆盖默认值。
以下示例将覆盖默认的 “add a line” 按钮,用 3 个新按钮替换它:”Add a product”、”Add a section” 和 “Add a note”。
“Add a product” 会将字段 ‘display_type’ 设置为其默认值。
另外两个按钮会将字段 ‘display_type’ 分别设置为 ‘line_section’ 和 ‘line_note’。
<control> <create string="Add a product" /> <create string="Add a section" context="{'default_display_type': 'line_section'}" /> <create string="Add a note" context="{'default_display_type': 'line_note'}" /> </control>
- 2
由于历史原因,它源自 tree 类型的视图,后来被改造为更接近表格/列表的显示方式
映射¶
Enterprise feature此视图能够在地图上显示记录以及记录之间的路线。记录以图钉表示。它还支持在与记录图钉关联的弹出窗口中显示模型的字段。
Note
应用此视图的模型应包含一个 res.partner 多对一字段,因为视图依赖 res.partner 的地址和坐标字段来定位记录。
API¶
该视图使用地理位置数据平台的 API 获取地图瓦片(地图背景)、进行地址转发(将地址转换为一组坐标)并获取路线。该视图实现了两个 API:OpenStreetMap 和 MapBox。默认使用 OpenStreetMap,它可以获取 tiles 并执行 geoforwarding。此 API 不需要令牌。一旦在常规设置中提供了有效的 MapBox 令牌,视图就会切换到 MapBox API。此 API 更快,并且支持路线计算。可通过在 MapBox 上 signing up 获取令牌。
结构组件¶
该视图的根元素是 <map>。它可以具有以下属性:
res_partner包含
res.partner多对一字段。如果未提供,视图将创建一个空地图。default_order如果提供了字段,视图将覆盖模型的默认排序。该字段必须是应用此视图的模型的一部分,而不是
res.partner的字段。routing如果为
1,则显示记录之间的路线。视图需要有效的 MapBox 令牌以及至少两条已定位的记录(即记录具有res.partner多对一字段,且该业务伙伴拥有地址或有效坐标)。hide_name如果为
1,则在图钉弹出窗口中隐藏名称(默认:0)。hide_address如果为
1,则在图钉弹出窗口中隐藏地址(默认:0)。hide_title如果为
1,则在图钉列表中隐藏标题(默认:0)。panel_title用作图钉列表标题的字符串。如果未提供,标题为动作的名称;如果视图不在动作中,则为 “Items”。
limit要获取的最大记录数(默认:80),必须为正整数。
<map> 元素可以包含多个 <field> 元素。每个 <field> 元素会被解释为图钉弹出窗口中的一行。字段的属性如下:
name要显示的字段。
string显示在字段内容之前的字符串。可用作描述。
- 以下是一个地图示例:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1"> <field name="partner_id" string="Customer Name"/> </map>
透视表¶
透视表视图用于以 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在 date 和 datetime 字段上,按指定的时间间隔(
day、week、month、quarter或year)分组,而不是按具体的 datetime(固定到秒)或 date(固定到天)分组。
invisible可选)如果为 true,该字段既不会出现在激活的度量项中,也不会出现在可选择的度量项中(适用于聚合后没有意义的字段,例如单位不同的字段,如 € 和 $)。
度量项自动由模型字段生成;仅使用可聚合的字段。这些度量项还会按字段的 string 属性按字母顺序排序。
Warning
与图形视图一样,透视表基于数据库内容聚合数据,这意味着未存储的计算字段(function 字段)不能用于透视表视图
在透视表视图中,field 可以具有 widget 属性来指定其格式。该 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>
QWeb¶
QWeb 视图是位于视图 arch 中的标准 QWeb 模板 模板。它们没有特定的根元素。由于 QWeb 视图没有特定的根元素,必须显式指定其类型(无法从 arch 字段的根元素推断)。
QWeb 视图有两种使用场景:
它们可以用作前端模板,此时应使用 template 作为快捷方式。
它们可以用作真正的 qweb 视图(在动作中打开),此时应将其定义为带有显式
type无法推断)和模型的常规视图。
qweb-as-view 相对于基本 qweb-as-template 的主要新增内容如下:
qweb-as-view 对带有 CSS 类
o_qweb_cp_buttons的<nav>元素做了特殊处理:其内容应为按钮,将被提取并移动到控制面板的按钮区域,<nav>本身会被移除;这是针对控制面板视图尚未存在的一种变通方案qweb-as-view 渲染会在标准 qweb 渲染上下文中添加若干条目:
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()。
搜索¶
搜索视图有别于以往的视图类型:它不显示 内容,虽然作用于特定模型,但用于过滤其他视图的内容(一般为聚合视图,例如 列表 或 图表)。除这一用例差异外,它们的定义方式相同。
搜索视图的根元素为 <search>,它不接受任何属性。
搜索视图可能的子元素有:
field字段可以用用户提供的值来定义域或上下文。生成搜索域时,各字段的域之间以及它们与筛选器之间会以 AND 组合。
字段可以具有以下属性:
name要筛选的字段名称
string字段的标签
operator默认情况下,字段会生成形如
[(name, operator, provided_value)]的域,其中name是字段名,provided_value是用户提供的值,可能经过筛选或转换(例如用户应提供 selection 字段取值的 标签,而不是取值本身)。operator属性允许覆盖默认操作符,默认操作符取决于字段类型,例如 float 字段为=,而 char 字段为ilikefilter_domain用作该字段搜索域的完整域,可使用
self变量把用户提供的值注入自定义域中。相比单独的operator,它可以生成灵活性强得多的域(例如一次搜索多个字段)若同时提供
operator和filter_domain,则以filter_domain为准。context允许添加上下文键,包括用户提供的值(与
domain一样,这些值通过self变量提供,例如对于Many2one字段是一个值数组[id_1, id_2])。默认情况下字段不会生成域。Note
域和上下文两者都会生成(若指定了
context)。如果只想生成上下文值,请将filter_domain设为空列表:filter_domain="[]"groups使该字段仅对特定用户可用
domain如果字段能够提供自动补全(例如
Many2one),则筛选可能的补全结果。
filter筛选器是搜索视图中的预定义开关,只能启用或禁用。其主要用途是向搜索上下文(传递给数据视图用于搜索/筛选的上下文)添加数据,或在搜索筛选中追加新的分组。
过滤器可以具有以下属性:
string(必填)筛选器的标签
domain可选)一个 Odoo 域,会作为搜索域的一部分追加到动作的域之后。
date(可选)类型为
date或datetime的字段的名称。使用该属性会在筛选器菜单的子菜单中创建一组可用的筛选器。所提供的筛选器取决于时间,但并非动态的,因为它们的域是在控制面板实例化时求值的。示例:
<filter name="filter_create_date" date="create_date" string="Creation Date"/>
上述示例便于快速搜索创建日期字段值位于下列时段之一(假设当前月份为 2019 年 8 月)的记录。
Create Date > August July June Q4 Q3 Q2 Q1 -------------- 2019 2018 2017
允许多选选项。
default_period(可选)仅对带有非空
date属性的筛选器有意义。用于确定当该筛选器属于视图初始化时默认激活的筛选集合时,哪些时间段会被激活。若未提供,默认使用 ‘this_month’。可在以下选项中选择:today、this_week、this_month、last_month、antepenultimate_month、fourth_quarter、third_quarter、second_quarter、first_quarter、this_year、last_year、antepenultimate_year。
该属性接受以逗号分隔的值。
示例:
<filter name="filter_create_date" date="create_date" string="Creation Date" default_period="this_week"/> <filter name="filter_create_date" date="create_date" string="Creation Date" default_period="this_year,last_year"/>
context一个 Python 字典,会合并到动作的域中以生成搜索域
键
group_by可用于定义在”分组”菜单中可用的分组方式,’group_by’ 的值可以是有效的字段名。<filter name="groupby_category" string="Category" context="{'group_by': 'category_id'}"/>
上面定义的 groupby 可以按类别对数据分组。
当字段类型为
date或datetime时,该筛选器会生成“分组方式”菜单的子菜单,其中提供以下时间间隔选项:日、周、月、季度、年。如果过滤器位于视图初始化时激活的默认过滤器集合中,记录默认按月分组。可以按照下文示例,使用 ‘date_field:interval’ 语法更改分组间隔。
示例:
<filter name="groupby_create_date" string="Creation Date" context="{'group_by': 'create_date:week'}"/>
Note
按字段分组时,read_group 的结果可能受该字段的 group_expand 属性影响,从而可在需要时显示空分组。更多信息请参阅
Field属性文档。namehelp筛选器的较长说明文本,可作为工具提示显示
groups使筛选器仅对特定用户可用
Tip
New in version 7.0.
连续的过滤器序列(其间没有非过滤器分隔)被视为并集组合:它们将以
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 的记录。Note
XML 不允许在 XML 元素内部使用
<,应改用实体引用(<)。separator可用于在简单搜索视图中分隔筛选分组
group可用于分隔筛选分组,在复杂搜索视图中比
separator更易读searchpanel允许在任意多记录视图的左侧显示搜索面板。默认情况下,列表视图和看板视图已启用搜索面板。可通过以下属性在其他视图中激活搜索面板:
view_types以逗号分隔的视图类型列表,用于指定默认启用搜索面板的视图类型:’tree,kanban’
该工具用于按指定字段快速筛选数据。这些字段需作为
searchpanel的直接子元素声明,标签名为field,并可使用以下属性:name(必填)要筛选的字段名称
select用于确定行为和显示方式。可选值为
one(默认) 最多只能选中一个值。支持的字段类型为 many2one 和 selection。multi可以选中多个值(复选框)。支持的字段类型为 many2one、many2many 和 selection。
groups限定为特定用户
string用于确定要显示的标签
icon指定使用哪个图标
color用于确定图标颜色
在
multi情形下还提供以下可选属性:enable_counters默认为 false。设为 true 时,会计算记录计数并在其非零时显示。
该功能的实现是为了应对性能过差的情况。
解决性能问题的另一种方式是正确覆盖
search_panel_select_range和search_panel_select_multi_range方法。expand默认为 false。设为 false 时,记录数为 0 的分类或筛选器将被隐藏。
limit默认为 200。整数,决定为该字段获取的最大值数量。如果达到上限,搜索面板中将不显示任何值,而是显示一条错误消息,因为我们认为这样没有意义 / 性能太差。设为 0 时会获取所有值。
根据所选情形,还提供以下可选属性:
one情形:hierarchize(仅对 many2one 字段可用)默认为 true。控制分类的显示样式:
设置为 true 时,子分类会显示在其相关父分类之下;否则所有分类将显示在同一层级。
multi情形:domain:用于确定 comodel 记录必须满足的条件。
可以使用域来表达对搜索面板中另一个字段(select=”one”)的依赖。注意 /!该属性与启用计数器的 select=”one” 不兼容;如果某个 select=”multi” 具有
domain属性,则所有 select=”one” 的计数器都会被禁用。<searchpanel> <field name="department_id"/> <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/> </searchpanel>
在上述示例中,界面上 manager_id(经理名称)可用值的范围,取决于字段
department_id当前选中的值。groupby:comodel 上的字段名(仅 many2one 和 many2many 字段可用)。值将按该字段分组。
搜索默认值¶
可以通过动作的 context,使用 search_default_name 键来配置搜索字段与过滤器。字段的值应为要设置在字段中的值;过滤器的值为布尔值或数字。例如,假设 foo 是字段、bar 是过滤器,则动作上下文为:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
将自动启用 bar 筛选器,并在 foo 字段中搜索 acro。
可以使用数值(1 到 99 之间)来描述默认分组(groupby)的顺序。例如,如果 foo 和 bar 表示两个分组
{
'search_default_foo': 2,
'search_default_bar': 1
}
效果是先激活 bar,再激活 foo。