视图¶
视图是定义记录如何显示给最终用户的方式。它们以XML格式指定,这意味着可以独立于它们所代表的模型进行编辑。它们灵活且允许对其控制的屏幕进行高度自定义。存在各种类型的视图。每个视图代表一种可视化模式: 表单 、 列表 、 看板 等。
通用结构¶
通常,基本视图共享下面定义的通用结构。占位符用大写字母表示。
<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>
字段¶
View对象公开了许多字段。除非另有说明,否则它们都是可选的。
name
(mandatory)Char
只有在某种列表中查找视图时,作为视图的助记符/描述才有用。
model
Char
视图所链接的模型(如适用)。
priority
Integer
当通过
(model, type)
请求视图时,将返回与模型和类型匹配且优先级最低的视图(即默认视图)。它还定义了在 视图继承 过程中应用视图的顺序。
groups_id
Many2many
->odoo.addons.base.models.res_users.Groups
允许使用/访问当前视图的组。
如果视图扩展了现有视图,则只有当用户具有访问所提供的
groups_id
的权限时,扩展才会应用于给定用户。arch
Text
视图布局的描述。
属性¶
不同的视图类型具有各种属性,允许对通用行为进行自定义。这里将解释一些主要属性。它们并不对所有视图类型都产生影响。
注解
当前上下文和用户访问权限也可能影响视图的能力。
create
禁用/启用视图上的记录创建。
edit
(form
&list
&gantt
)在视图上禁用/启用记录编辑。
delete
(form
&list
)通过 操作 下拉菜单禁用/启用视图上的记录删除。
duplicate
(form
)通过 操作 下拉菜单在视图上禁用/启用记录复制。
decoration-{$name}
(list
&gantt
)根据相应记录的属性,定义类似于行文本的记录的条件显示。
值是Python表达式。对于每个记录,表达式将使用记录的属性作为上下文值进行评估,如果为
true
,则将应用相应的样式到行中。以下是上下文中其他可用的值:uid
: the id of the current user,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>
警告
两种视图类型支持的值不同。甘特视图仅支持
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
a route address to be fetched and prepended to the view.如果设置了此属性,则会获取并显示 controller 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_id
Many2one
当前视图的父视图,默认未设置。使用
ref
属性指定父视图:<field name="inherit_id" ref="library.view_book_form"/>
mode
Selection
:extension / primary
继承模式,如果设置了
inherit_id
,则默认为extension
,否则为primary
。一个你可能想要在使用
inherit_id
时覆盖mode
的例子是委托继承。在这种情况下,派生模型将与其父模型分开,与一个匹配的视图不会与另一个匹配。假设你继承了与父模型关联的视图,并且想要自定义派生视图以显示来自派生模型的数据。派生视图的mode
需要设置为primary
,因为它是该派生模型的基础(也可能是唯一)视图。否则, 视图匹配 规则将不适用。
视图匹配¶
如果通过
(model, type)
请求视图,则匹配具有正确模型和类型、mode=primary
和最低优先级的视图。当通过
id
请求视图时,如果其模式不是primary
,则会匹配其具有primary
模式的 最近 父级。
视图解析¶
Resolution generates the final arch
for a requested/matched primary
view:
如果视图有父级,则先完全解析父级,然后应用当前视图的继承规范
如果视图没有父级,则其
arch
保持不变查找当前视图的子视图,使用
extension
模式,并深度优先应用它们的继承规范(先应用子视图,然后是它的子视图,最后是它的兄弟视图)
应用子视图的结果产生最终的 arch
继承规范¶
继承规范由元素定位器组成,用于匹配父视图中继承的元素,以及将用于修改继承元素的子元素。
有三种元素定位器可用于匹配目标元素:
一个带有
expr
属性的xpath
元素。expr
是一个XPath_表达式1,应用于当前的arch
,它找到的第一个节点是匹配项具有
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>
Inheritance规范可以有一个可选的 position
属性,指定匹配节点应如何更改:
inside
(default)继承规范的内容将附加到匹配的节点上
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>
视图的规格按顺序应用。
- 1
在 QWeb 视图中添加了一个扩展函数,用于更简单的匹配:
hasclass(*classes)
匹配上下文节点是否具有所有指定的类
通用模型¶
属性¶
- Model._date_name = 'date'¶
用于默认日历视图的字段
方法¶
- Model.get_views(views, options=None)[源代码]¶
返回给定视图的字段视图,以及当前模型的字段,以及可选地为给定操作返回其过滤器。
- 参数
views – 视图列表 [视图ID,视图类型]
options (dict) – 一个可选的布尔标志字典,设置为启用:
toolbar
包括加载 fields_views 时的上下文操作load_filters
返回模型的过滤器action_id
获取过滤器的操作ID,否则加载全局过滤器或模型
- 返回
包含 fields_views、fields 和可选 filters 的字典
视图类型¶
活动¶
活动视图用于显示与记录相关联的活动。数据以图表形式显示,记录形成行,活动类型形成列。每行的第一个单元格显示一个(可自定义,参见 templates
,与 看板 相似)卡片,代表相应的记录。点击其他单元格时,会显示该记录的所有相同类型活动的详细描述。
警告
只有在安装了 mail
模块并且继承自 mail.activity.mixin
的模型中,才能使用活动视图。
活动视图的根元素是 <activity>
,它接受以下属性:
string
(mandatory)一个描述视图的标题
视图元素的可能子元素有:
field
声明在活动 逻辑 中使用的字段。如果字段仅在活动视图中显示,不需要预先声明。
可能的属性有:
name
(required)要获取的字段的名称
templates
定义了 QWeb模板 模板。卡片定义可以分成多个模板以增加清晰度,但是活动视图 必须 定义至少一个根模板
activity-box
,该模板将为每个记录渲染一次。活动视图主要使用标准的 javascript qweb 并提供以下上下文变量 (详见 看板 获取更多详情):
widget
当前的
ActivityRecord()
,可以用于获取一些元信息。这些方法也可以直接在模板上下文中使用,无需通过widget
访问。record
一个对象,其属性是所有请求的字段。每个字段都有两个属性
value
和raw_value
日历¶
日历视图将记录显示为每日、每周、每月或每年的事件。
注解
默认情况下,日历视图将以当前日期(今天)为中心。您可以将特定的初始日期传递给操作的上下文,以便将日历的初始焦点设置在围绕此日期的期间(参见 mode
)(使用的上下文键为 initial_date
)
它们的根元素是 <calendar>
。日历视图上可用的属性有:
date_start
(required)记录中保存事件开始日期的字段名称
date_stop
如果提供了
date_stop
,则记录的字段名称将包含事件的结束日期,记录将可以通过拖放直接在日历中移动date_delay
替代
date_stop
,提供事件的持续时间而不是其结束日期(单位:天)color
用于 颜色分段 的记录字段名称。在日历中,同一颜色分段的记录被分配相同的高亮颜色,颜色被半随机分配。在侧边栏中显示可见记录的display_name/avatar
form_view_id
在用户创建或编辑事件时打开的视图。请注意,如果未设置此属性,则日历视图将回退到当前操作中表单视图的ID(如果有)。
event_open_popup
如果选项 ‘event_open_popup’ 设置为 true,则日历视图将在 FormViewDialog 中打开事件(或记录)。否则,它将在新的表单视图中打开事件(使用 do_action)。
quick_add
在点击时启用快速事件创建:只要求用户提供
name``(可以通过 ``rec_name
控制保存该值的字段),然后尝试仅使用该值和点击的事件时间创建新事件。如果快速创建失败,则回退到完整的表单对话框create_name_field
记录的字段名称,保存记录的文本表示形式,用于通过“快速创建”机制创建记录时使用
all_day
记录中一个布尔字段的名称,指示相应的事件是否被标记为全天事件(持续时间无关紧要)
mode
加载日历时的默认显示模式。可能的属性有:
day
,week
,month
,year
scales
提供的比例尺的逗号分隔列表。默认情况下,所有比例尺都可用。有关可能的比例尺值,请参见模式。
create
,delete
允许通过将相应的属性设置为
false
来在视图中禁用相应的操作<field>
声明要聚合或在看板 逻辑 中使用的字段。如果字段仅在日历卡片中显示。
字段可以有额外的属性:
invisible
在卡片中隐藏该值,请使用“True”
avatar_field
仅适用于x2many字段,在卡片中显示头像而不是显示名称
write_model
和write_field
和filter_field
您可以添加筛选器并将结果保存在定义的模型中,筛选器将添加在侧边栏中。
filter_field
是可选的,允许您指定将保存筛选器状态的字段。filters
和color
使用”True”将此字段添加到侧边栏的筛选器中。您可以指定一个
color
字段用于给复选框上色。
同期¶
Enterprise feature群体视图用于显示和理解一些数据随时间变化的方式。例如,假设对于某个企业,客户可以订阅某些服务。然后,群体视图可以显示每个月的订阅总数,并研究客户离开服务的速率(流失率)。单击单元格时,群体视图将重定向您到一个新的操作,您将只看到单元格时间间隔内包含的记录;此操作包含列表视图和表单视图。
注解
默认情况下,同一列表和表单视图将在动作上定义。您可以将列表视图和表单视图传递给动作的上下文,以设置/覆盖将使用的视图(使用的上下文键为 form_view_id
和 list_view_id
)
例如,这里是一个非常简单的同期视图:
<cohort string="Subscription" date_start="date_start" date_stop="date" interval="month"/>
Cohort视图的根元素是<cohort>,它接受以下属性:
string
(mandatory)一个描述视图的标题
date_start
(mandatory)一个有效的日期或日期时间字段。该字段被视图理解为记录的开始日期。
date_stop
(mandatory)一个有效的日期或日期时间字段。该字段被视图理解为记录的结束日期。这是确定流失的字段。
mode
(optional)一个描述模式的字符串。它应该是’churn’或’retention’(默认)。Churn模式将从0%开始随着时间的推移而累积,而retention模式将从100%开始随着时间的推移而减少。
timeline
(optional)一个描述时间轴的字符串。它应该是’backward’或’forward’(默认)。前向时间轴将显示从date_start到date_stop的数据,而后向时间轴将显示从date_stop到date_start的数据(当date_start在未来/大于date_stop时)。
interval
(optional)描述时间间隔的字符串。它应该是 ‘day’,’week’,’month’(默认)或 ‘year’。
measure
(optional)可聚合的字段。该字段将用于计算每个单元格的值。如果未设置,则队列视图将计算出现次数。
<field>
(optional)允许指定特定字段以便从可用的度量中进行管理,其主要用途是隐藏可选度量中的字段:
name
(mandatory)在视图中使用的字段名称。
string
(optional)将在队列视图中显示该字段的名称,覆盖字段的默认 Python 字符串属性。
invisible
(optional)如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中(对于不适合聚合的字段非常有用,例如不同单位的字段,例如 € 和 $)。
表单¶
表单视图用于显示单个记录的数据。它们的根元素是 <form>
。它们由常规的 HTML 组成,还有额外的结构和语义组件。
结构组件¶
结构组件提供结构或“视觉”特征,具有较少的逻辑。它们用作表单视图中的元素或元素集。
notebook
定义一个带有选项卡的部分。每个选项卡通过一个
page
子元素来定义。页面可以具有以下属性:string
(required)选项卡的标题
accesskey
attrs
基于记录值的标准动态属性
注解
请注意,
notebook
不应放置在group
内group
用于在表单中定义列布局。默认情况下,组定义2列,大多数组的直接子元素占用1列。组的
field
直接子元素默认显示标签,标签和字段本身各自具有1个colspan。The number of columns in a
group
can be customized using thecol
attribute, the number of columns taken by an element can be customized usingcolspan
.子元素水平排列(尝试填充下一列,然后再换行)。
Groups can have a
string
attribute, which is displayed as the group’s titlenewline
只在
group
元素内有用,提前结束当前行并立即切换到新行(在此之前不填充任何剩余列)separator
小的水平间距,带有
string
属性的行为类似于一个标题sheet
可以作为
form
的直接子元素使用,用于更窄和更具响应性的表单布局header
与
sheet
结合使用,提供了一个全宽度的位置,位于表单本身上方,通常用于显示工作流按钮和状态小部件
语义组件¶
语义组件与Odoo系统相连,并允许与之交互。可用的语义组件包括:
button
调用Odoo系统,类似于 列表视图按钮。此外,还可以指定以下属性:
special
对于在对话框中打开的表单视图:
save
保存记录并关闭对话框,cancel
关闭对话框而不保存。confirm
在执行按钮的Odoo调用之前,要显示的确认消息(并由用户接受)(在看板视图中也适用)。
field
渲染(并允许编辑)当前记录的单个字段。在表单视图中多次使用字段是支持的,并且字段可以接收不同的修饰符’invisible’和’readonly’的值。但是,当存在多个字段具有不同的修饰符’required’的值时,行为不能保证。字段节点的可能属性包括:
name
(mandatory)要呈现的字段的名称
id
节点 ID。当视图中存在多个相同字段的情况时有用(参见下面的
标签
组件)。默认为字段名称。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
当编辑该字段的值时调用指定的方法,可以生成更新其他字段或向用户显示警告
8.0 版后已移除: 在模型上使用
odoo.api.onchange()
attrs
基于记录值的动态元参数
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
(mandatory)与标签相关联的字段的引用。可以是字段的名称,也可以是其id(在“field”上设置的“id”属性)。当视图中存在多个相同字段的情况,并且有多个与这些“field”节点关联的“label”组件时,这些标签必须具有唯一的“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 视图的根元素是 <gantt/>
,它没有子元素,但可以使用以下属性:
date_start
(required)每条记录提供事件开始日期时间的字段名称。
date_stop
(required)为每个记录提供事件结束时间的字段名称。
dependency_field
提供两个记录之间依赖关系的
many2many
字段的名称。如果B依赖于A,则dependency_field
是允许从B获取A的字段。这个字段和dependency_inverted_field
字段都用于绘制依赖箭头,以便调整它们的时间表。- ``dependency_inverted_field``(如果提供了``dependency_field``则必填)
提供反向依赖关系的
many2many
字段的名称比dependency_field
更倾向于。如果B依赖于A,dependency_inverted_field
是允许从A获取B的字段。color
用于根据其值着色药丸的字段名称
decoration-{$name}
允许根据相应记录的属性更改行文本的样式。
值是Python表达式。对于每个记录,表达式将使用记录的属性作为上下文值进行评估,如果为
true
,则将应用相应的样式到行中。以下是上下文中其他可用的值:uid
: the id of the current user,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
将“group by”字段作为键,最大合并值达到显示红色单元格之前的字典(例如
{"user_id": 100}
)consolidation_exclude
描述任务是否需要从合并中排除的字段名称,如果设置为true,则在合并行中显示带条纹的区域
create
,cell_create
,edit
,delete
,plan
允许通过将相应的属性设置为
false
(默认值:true
)来 禁用 视图中的相应操作。create
:如果启用,控制面板中将会有一个“添加”按钮,用于创建记录。cell_create
:如果启用并且启用了``create``,则在悬停在时间槽单元格上时将显示一个”+”按钮,以在该槽上创建新记录。edit
: If enabled, the opened records will be in edit mode (thus editable).plan
:如果启用并且启用了``edit``,将在时间槽上显示一个“放大镜”按钮,以将未分配的记录计划到该时间槽。
Example
当您不想在甘特视图上创建记录,并且模型需要开始和结束日期时,应禁用计划功能,因为永远找不到记录。
offset
根据规模,添加到今天以计算默认周期的单位数。例如:在默认规模为周的情况下,偏移量为+1将打开下周的甘特图视图,在默认规模为月的情况下,偏移量为-2将打开2个月前的甘特图视图。
progress
记录事件完成百分比的字段名称,介于0和100之间
string
甘特图视图的标题
precision
JSON 对象,指定每个刻度中药丸的捕捉精度。
可用的刻度值为
day
(默认值:hour
):hour
: records times snap to full hours (ex: 7:12 becomes 8:00)hour:half
: records times snap to half hours (ex: 7:12 becomes 7:30)hour:quarter
: records times snap to half hours (ex: 7:12 becomes 7:15)
Possible values for scale
week
are (default:day:half
):day
: records times snap to full days (ex: 7:28 AM becomes 11:59:59 PM of the previous day, 10:32 PM becomes 12:00 PM of the current day)day:half
: records times snap to half hours (ex: 7:28 AM becomes 12:00 PM)
可用的刻度值为
month
(默认值:day:half
):day
: records times snap to full days (ex: 7:28 AM becomes 11:59:59 PM of the previous day, 10:32 PM becomes 12:00 PM of the current day)day:half
: records times snap to half hours (ex: 7:28 AM becomes 12:00 PM)
Scale
year
always snap to full day.精度属性的示例:
{"day": "hour:quarter", "week": "day:half", "month": "day"}
total_row
布尔值,用于控制是否显示包含记录总数的行。(默认值:
false
)collapse_first_level
布尔值,用于控制是否可以折叠每一行,如果按一个字段分组。(默认值:
false
,当按两个字段分组时开始折叠)display_unavailability
boolean 用于标记模型的
gantt_unavailability
函数返回的日期在甘特图视图中是否可用。记录仍然可以在其中安排,但它们的不可用性会在视觉上显示出来。(默认值:false
)default_scale
渲染视图时的默认比例。可能的值为(默认值:
month
):day
week
month
year
scales
逗号分隔的允许此视图的比例列表。默认情况下,允许所有比例。要在此列表中使用的可能比例值,请参见
default_scale
。templates
定义了 QWeb模板 模板
gantt-popover
,当用户悬停在甘特图视图中的记录之一时使用。gantt视图主要使用标准的 javascript qweb 并提供以下上下文变量:
widget
当前的
GanttRow()
可以用于获取一些元信息。getColor
方法可以将其转换为颜色整数,也可以直接在模板上下文中使用,而不需要使用widget
。on_create
如果在视图上点击添加按钮时指定了此参数,则不会打开通用对话框,而是启动一个客户端操作。此参数应该包含操作的xmlid(例如:
on_create="%(my_module.my_wizard)d"
form_view_id
在用户创建或编辑记录时打开的视图。请注意,如果未设置此属性,则甘特图视图将回退到当前操作中表单视图的ID(如果有)。
dynamic_range
如果设置为 true,则甘特图视图将从第一条记录开始,而不是从年/月/日的开始处开始。
pill_label
如果设置为true,则在将刻度设置为周或月时,时间将显示在药丸标签中。 (例如
7:00 AM - 11:00 AM (4h) - DST Task 1
)thumbnails
如果组是关系字段,这将允许在组名旁边显示缩略图。这需要一个Python字典,其键是活动模型上字段的名称。值是相关模型上持有缩略图的字段的名称。
例如:任务有一个字段 user_id,它引用了 res.users。res.users 模型有一个字段 image,它保存了头像,那么:
<gantt date_start="date_start" date_stop="date_stop" thumbnails="{'user_id': 'image_128'}" > </gantt>
将按用户ID分组时,显示用户头像在其名称旁边。
图表¶
图表视图用于可视化一组记录或记录组的聚合。其根元素为 <graph>
,可以使用以下属性:
type
(optional)one of
bar
(default),pie
andline
, the type of graph to usestacked
(optional)仅用于
bar
图表。设置为0
以防止组内的柱形图最初被堆叠。disable_linking
(optional)将其设置为
1
以防止将图表上的点击重定向到列表视图order
(optional)如果设置,x轴的值将按照给定的顺序(
asc``或``desc
)默认排序,根据它们的度量进行排序。仅用于``bar``和``pie``图表。string
(optional)重定向到列表视图时在面包屑中显示的字符串。
图表视图中唯一允许的元素是 field
,它可以具有以下属性:
name
(mandatory)视图中要使用的字段名称。如果用于分组(而不是聚合),请使用此字段。
invisible
(optional)如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中。
type
(optional)如果设置为
measure
,该字段将被用作分组内的聚合值,而不是分组条件。它仅适用于具有该属性的最后一个字段,但对于具有字符串属性的其他字段也很有用(见下文)。interval
(optional)在日期和日期时间字段上,按指定的间隔(
day
、week
、month
、quarter
或year
)进行分组,而不是按照具体的日期时间(固定的秒分辨率)或日期(固定的天分辨率)进行分组。默认为month
。string
(optional)仅用于具有
type="measure"
的字段。在图表视图中显示字段的名称,覆盖字段的默认 Python 字符串属性。
度量值是从模型字段自动生成的;只使用可聚合字段。这些度量值也按字段字符串的字母顺序排序。
警告
图形视图聚合是在数据库内容上执行的,非存储函数字段不能在图形视图中使用。
网格¶
Enterprise feature限制¶
此视图正在进行中,可能需要扩展或更改。
只有
date
列字段已经测试过,selection
和many2one
名义上已经实现和支持,但尚未测试,datetime
根本没有实现。列单元格几乎不可配置且必须为数字
单元格调整默认情况下被禁用,必须配置为启用
create
,edit
和delete
ACL 元数据不会自动设置在视图根上,因为在fields_view_get
后处理中存在限制(有一个固定的显式列表来获取这些属性的视图类型)
模式¶
网格视图在此模块中具有自己的架构和额外的验证。视图架构如下:
<grid>
(1)架构根元素
必填的
string
属性可选的
create
,edit
和delete
属性可选的
adjustment
和adjust_name
属性adjustment
可以是object
或action
,用于指示是否通过方法调用或操作执行来执行单元格的调整。adjust_name
分别提供了方法名称和操作 id。在这两种情况下,调整参数都作为
grid_adjust
上下文成员提供,在object
情况下,参数也作为位置函数参数提供(紧挨着一个空的 id 列表):row_domain
匹配已调整单元格整行的域
column_field
调整单元格的列名称
column_value
已调整单元格的列的值
cell_field
已调整单元格的度量字段
change
单元格旧值和调整后值之间的差异可能为正或负
可选的
hide_line_total
和hide_column_total
属性hide_line_total
设置为 true 以隐藏总行(默认为 false)
hide_column_total
设置为 true 以隐藏总计列(默认为 false)
可选的
barchart_total
属性barchart_total
设置为
true
以在网格底部显示基于列总计的条形图(默认为false)。
可选的
create_inline
和display_empty
属性create_inline
设置为
true
以在网格底部显示一个额外的行,带有一个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(``object``按钮)或上下文的``active_ids``(``action``按钮)
<field type="row">
(1+)行分组字段,如果有的话,将被搜索视图的 groupby 过滤器替换。
在视图中,
row
字段的顺序决定了它们的分组深度:如果第一个字段是school
,第二个字段是age
,那么记录将首先按school
分组,然后在每个学校内按age
分组。<field type="col">
(1)列分组字段。
col字段可以包含0个或多个
<range>
元素,用于指定可自定义的列范围。range
元素具有以下强制属性name
可以通过
grid_range
上下文值来覆盖默认范围(默认情况下为第一个)string
范围按钮的标签(用户可见)
span
在视图中一次显示的所有列的跨度的符号名称,可能会触发分页。
对于
date
字段,有效的时间跨度目前有week
和month
。step
前一列和后一列之间的步骤的符号名称
对于
date
字段,目前唯一有效的跨度是day
。
<field type="measure">
(1)Cell field, automatically accumulated (by
read_group
).测量字段可以使用
widget
属性来自定义其显示。
服务器交互¶
除了可选按钮外,网格视图目前调用两个方法:
read_grid
(provided on all models by the module) returns almost the entirety of the grid’s content as a dict:行标题是一个带有以下键的字典列表:
values
(required)这将映射到一个字典,每个``row``字段都有一个键,值始终是``[value, label]``的形式。
domain
(required)在单元格调整期间需要复制记录时,此行源记录的域
列标题是一个至少包含一个键的字典列表:
values
(required)查看行标题值
domain
(required)查看列域值
current
(optional)布尔值,标记/突出显示一列
将网格数据作为单元格字典的列表(行的列表)的列表返回,每个单元格字典都具有以下键:
value
与单元格相关联的数值
domain
匹配单元格记录的域(应被视为不透明)
size
单元格中分组的记录数
readonly
(optional)一个布尔值,指示此特定单元格不应该在客户端进行编辑
classes
(optional)一个字符串列表,包含要添加到单元格容器中(在单元格的 TD 和可编辑元素之间)的类。
在这个列表和基类(以
o_grid_cell_
为前缀)之间发生冲突时,将忽略此列表中的类。
请注意,网格数据是 密集的 ,如果查询数据库时没有匹配到任何组与单元格匹配,则会生成一个带有默认值的”空”单元格,以满足必需键。
prev
和next
可以是 falsy(无分页)或者是一个上下文项,用于合并到视图自身的上下文中,以便于read_grid
读取上一页或下一页,应该假设它是不透明的
``read_grid_domain(field, range)``(由模块提供在所有模型上)返回与网格的当前配置的“span”匹配的域。这也是由``read_grid``在内部完成的,但是可以独立调用并与单独的例如``search_count``或``read_group``一起使用。
adjust_grid
, for which there currently isn’t a blanket implementation and whose semantics are likely to evolve with time and use cases
服务器钩子¶
read_grid
calls a number of hooks allowing the customisation of its
operations from within without having to override the entire method:
_grid_format_cell(group, cell_field)
将 read_group(按组分组)的输出转换为上述格式的单元格(作为“网格数据”的一部分)
_grid_make_empty_cell(row_domain, column_domain, view_domain)
生成一个空的单元格版本(如果没有相应的组)
_grid_column_info(name, range)
基于列类型生成 ColumnMetadata 对象,存储值,可以直接返回(作为
read_grid
的一部分)或用于查询和将read_group
重新格式化为read_grid
:grouping
用于列的实际分组字段/查询
domain
如果列字段进行分页,则在
read_group
中应用的域,可以是空列表prev
和next
在当前页面之前和之后,将被发送到
read_grid
的上下文段。如果为False
,则禁用该方向的分页values
在“当前页面”上显示的列值,每个值都是一个带有以下键的字典:
values
将字段名称映射到整个列的值的字典,通常只有
name
-> 值domain
匹配此特定列的域
is_current
True
如果当前列应在网格中特别标出,False
否则format
如何将该列/类型的值从
read_group
格式转换为read_grid
格式(与 ColumnInfo 中的values
匹配)
访问控制列表¶
如果视图不可编辑,则单个单元格也不可编辑
如果视图不可创建,则不会显示“添加一行”按钮(当前它会创建一个新的空记录)
上下文键¶
grid_range
选择默认使用哪个范围,如果视图有多个范围
grid_anchor
如果适用,将用作列范围的默认锚点,而不是
read_grid
定义的默认值。对于日期字段,计算初始跨度的参考日期。默认日期锚定为“今天”(用户所在时区)
看板¶
kanban 视图是一个 kanban board 可视化:它将记录显示为”卡片”,介于 列表视图 和 不可编辑的 表单视图 之间。记录可以分组在列中,用于工作流可视化或操作(例如任务或工作进展管理),或者不分组(仅用于可视化记录)。
注解
看板视图最多会加载和显示十列。超过十列的列会被关闭(但用户仍然可以打开它们)。
Kanban 视图的根元素是 <kanban>
,它可以使用以下属性:
default_group_by
如果没有通过操作或当前搜索指定分组方式,是否应该对看板视图进行分组。当没有其他指定分组方式时,应该按字段名称进行分组。
default_order
如果用户尚未通过列表视图对记录进行排序,则使用的卡片排序顺序
class
向看板视图的根HTML元素添加HTML类
examples
如果设置为
KanbanExamplesRegistry
_ 中的一个键,列设置的示例将在分组看板视图中可用。这里 <https://github.com/odoo/odoo/blob/99821fdcf89aa66ac9561a972c6823135ebf65c0/addons/project/static/src/js/project_task_kanban_examples.js#L27>
_ 是如何定义这些设置的一个示例。group_create
“添加新列”栏是否可见。默认值:true。
group_delete
是否可以通过上下文菜单删除组。默认值:true。
group_edit
是否可以通过上下文菜单编辑组。默认值:true。
archivable
如果模型定义了一个
active
字段,则该字段所属的记录是否可以被归档/恢复。默认值:true。quick_create
是否应该允许在不切换到表单视图的情况下创建记录。默认情况下,当看板视图按many2one、selection、char或boolean字段分组时,
quick_create
是启用的,否则是禁用的。quick_create_view
form
view reference, specifying the view used for records quick creation.records_draggable
是否允许在看板分组时拖动记录。默认值:true。
将其设置为
true
以始终启用它,将其设置为false
以始终禁用它。groups_draggable
是否允许在看板分组时重新排序列。默认值:true。
将其设置为
true
以始终启用它,将其设置为false
以始终禁用它。
视图元素的可能子元素有:
field
声明在看板 逻辑 中使用的字段。如果字段仅在看板视图中显示,无需预先声明。
可能的属性有:
name
(required)要获取的字段的名称
allow_group_range_value
(optional)一个
date
或datetime
字段是否允许从分组范围(由分组的第一个和最后一个日期组成)计算出一个值。当看板视图按该字段分组时,启用“快速创建”和“拖放”功能。默认值:false。
progressbar
声明一个进度条元素,放置在看板列的顶部。
可能的属性有:
field
(required)用于在进度条中对列记录进行分组的字段名称
colors
(required)将上述字段值映射为”danger”、”warning”、”success”或”muted”颜色的JSON
sum_field
(optional)将被求和并显示在进度条旁边的字段的名称(如果省略,则显示记录的总数)
templates
定义了一组 QWeb模板 模板。卡片定义可以分成多个模板以增加清晰度,但是看板视图 必须 定义至少一个根模板
kanban-box
,该模板将为每条记录渲染一次。看板视图主要使用标准的 javascript qweb,并提供以下上下文变量:
widget
当前的
KanbanRecord()
可以用于获取一些元信息。这些方法也可以直接在模板上下文中使用,而不需要通过widget
访问。record
一个对象,其属性是所有请求字段。每个字段有两个属性
value
和raw_value
,前者根据当前用户参数进行格式化,后者是从read()
直接获取的值(除了日期和日期时间字段,它们根据用户的区域设置进行格式化 <https://github.com/odoo/odoo/blob/a678bd4e/addons/web_kanban/static/src/js/kanban_record.js#L102>`_)context
当前上下文来自操作,并且在嵌入表单视图的看板视图中,还包括 one2many 或 many2many 字段
user_context
不言自明
read_only_mode
不言自明
selection_mode
当从 m2o/m2m 字段选择记录时,在移动环境中打开看板视图时设置为 true。
注解
在移动环境中点击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
,分别将 新 记录显示在列表的顶部或底部。内联 表单视图 的架构源自列表视图。大多数适用于 表单视图 的字段和按钮的属性也适用于列表视图,尽管如果列表视图不可编辑,这些属性可能没有任何意义。
注解
如果
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
请参见
type
args
请参见
type
attrs
基于记录值的动态属性。
将属性映射到域,域在当前行记录的上下文中进行评估,如果为
True
,则在单元格上设置相应的属性。可能的属性是
invisible
(隐藏按钮)。states
shorthand for
invisible
attrs
: a list of states, comma separated, requires that the model has astate
field and that it is used in the view.如果记录不在所列状态之一,则使按钮``invisible``
危险
在使用
attrs
与states
结合时,可能会导致意外的结果,因为域会与逻辑 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
使列变为可选项。如果设置为“隐藏”,则列默认隐藏。如果设置为“显示”,则列默认可见。用户的可见性选择存储在浏览器的本地存储中。
注解
如果列表视图是
editable
,则来自 form view 的任何字段属性也是有效的,并且将在设置内联表单视图时使用。注解
在列表子视图中(在表单视图中显示的One2many/Many2many),属性
column_invisible
可以根据父对象隐藏列。<field name="product_is_late" attrs="{'column_invisible': [('parent.has_late_products', '=', False)]}"/>
注解
当列表视图被分组时,数值字段会被聚合并显示在每个组中。此外,如果一个组中有太多的记录,会在组行右侧出现一个分页器。因此,在列表视图可以被分组的情况下,不建议将数值字段放在最后一列(但对于表单视图中的x2many字段来说是可以的,因为它们无法被分组)。
groupby
定义自定义标题(带按钮)用于在many2one字段上对当前视图进行分组记录。还可以在
groupby
中添加field
,用于修饰符。因此,这些字段属于many2one comodel。这些额外的字段将批量获取。name
当前模型中many2one字段的名称。当按此字段名称对视图进行分组时,将显示自定义标题。
<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
在当前列表中添加一个按钮以创建新元素。
注解
如果定义了任何
create
,它将覆盖默认的“添加行”按钮。支持以下属性:
string
(required)按钮上显示的文本。
context
当检索新记录的默认值时,此上下文将与现有上下文合并。
例如,它可以用于覆盖默认值。
以下示例将通过将默认的“添加一行”按钮替换为3个新按钮:“添加产品”,“添加部分”和“添加注释”来进行覆盖。
“添加产品”将把“显示类型”字段设置为默认值。
另外两个按钮将分别将字段“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
由于历史原因,它起源于树形视图,后来被重新用于更多的表格/列表类型显示
地图¶
Enterprise feature此视图能够在地图上显示记录和它们之间的路线。记录由图钉表示。它还允许在与记录图钉相关联的弹出窗口中可视化模型中的字段。
注解
应用视图的模型应该包含一个 res.partner
many2one,因为视图依赖于 res.partner
的地址和坐标字段来定位记录。
API¶
视图使用位置数据平台的API来获取瓦片(地图的背景),进行地理转发(将地址转换为一组坐标)和获取路线。视图实现了两个API,OpenStreetMap和MapBox。默认情况下使用OpenStreetMap,能够获取 瓦片 和进行 地理转发。该API不需要令牌。只要在常规设置中提供了有效的 MapBox 令牌,视图就会切换到MapBox API。该API更快,并允许计算路线。可以通过 注册 MapBox 来获取令牌。
结构组件¶
视图的根元素是 <map>
。它可以具有以下属性:
res_partner
包含
res.partner
的 many2one 字段。如果未提供,则视图将创建一个空地图。default_order
如果提供了字段,则视图将覆盖模型的默认排序。字段必须是应用视图的模型的一部分,而不是来自
res.partner
。routing
如果为
1
,则显示记录之间的路线。视图需要有效的 MapBox 令牌和至少两个已定位的记录(即记录具有res.partner
many2one 并且合作伙伴具有地址或有效坐标)。hide_name
如果
1
隐藏名称在弹出窗口的针(默认:0
)。hide_address
如果
1
隐藏地址从弹出窗口的图钉 (默认:0
)。hide_title
如果
1
从固定列表中隐藏标题(默认值:0
)。panel_title
在固定列表中显示的标题字符串。如果未提供,则标题为操作的名称或如果视图不在操作中,则为“Items”。
limit
最大获取记录数(默认值:80)。必须是正整数。
The <map>
element can contain multiple <field>
elements. Each <field>
element is interpreted as a line in the pin’s popup. The field’s attributes are the following:
name
要显示的字段。
string
字段内容前要显示的字符串。它可以用作描述。
- 例如,这里是一张地图:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1"> <field name="partner_id" string="Customer Name"/> </map>
透视表¶
透视视图用于将聚合可视化为 透视表。其根元素是 <pivot>
,可以使用以下属性:
disable_linking
(optional)将其设置为
1
以删除表格单元格与列表视图的链接。display_quantity
(optional)将其设置为
1
以默认显示数量列。default_order
(optional)在视图中使用的默认顺序(升序或降序)的度量名称。
<pivot default_order="foo asc"> <field name="foo" type="measure"/> </pivot>
在透视图中,唯一允许的元素是 field
,它可以具有以下属性:
name
(mandatory)视图中要使用的字段名称。如果用于分组(而不是聚合),请使用此字段。
string
(optional)将用于在数据透视表视图中显示字段的名称,覆盖字段的默认 Python 字符串属性。
type
(optional)指示该字段应该作为分组标准还是在组内作为聚合值使用。可能的值为:
row
(default)按指定字段分组,每个组都有自己的行。
col
创建列分组
measure
在分组内聚合的字段
interval
在日期和日期时间字段上,按指定的间隔(
day
、week
、month
、quarter
或year
)进行分组,而不是按照具体的日期时间(固定秒分辨率)或日期(固定天分辨率)进行分组。
invisible
(optional)如果为真,则该字段既不会出现在活动度量中,也不会出现在可选择的度量中(对于不适合聚合的字段非常有用,例如不同单位的字段,例如 € 和 $)。
度量值是从模型字段自动生成的;只使用可聚合字段。这些度量值也按字段字符串的字母顺序排序。
警告
与图形视图一样,数据透视表在数据库内容上聚合数据,这意味着非存储函数字段不能在数据透视表视图中使用。
在透视视图中, 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>
QWeb¶
QWeb 视图是视图的 arch
中的标准 QWeb模板 模板。它们没有特定的根元素。因为 QWeb 视图没有特定的根元素,所以必须明确指定它们的类型(不能从 arch
字段的根元素中推断出来)。
QWeb视图有两种用途:
它们可以用作前端模板,在这种情况下,应该使用 template 作为快捷方式。
它们可以被用作实际的qweb视图(在操作内打开),在这种情况下,它们应该被定义为具有显式
类型
(它不能被推断)和模型的常规视图。
qweb-as-view 相对于基本的 qweb-as-template 的主要增强功能包括:
qweb-as-view 有一个特殊情况,针对带有 CSS 类
o_qweb_cp_buttons
的<nav>
元素:其内容应为按钮,并将被提取并移动到控制面板的按钮区域,<nav>
本身将被删除,这是一个解决控制面板视图尚不存在的方法qweb-as-view 渲染会在标准 qweb 渲染上下文中添加几个项目:
model
绑定到 qweb 视图的模型
domain
搜索视图提供的域
context
搜索视图提供的上下文
records
一个对
model.search(domain)
的延迟代理,如果你只想遍历记录而不执行更复杂的操作(例如分组),可以使用它
qweb-as-view 还提供了额外的渲染钩子:
_qweb_prepare_context(view_id, domain)
prepares the rendering context specific to qweb-as-viewqweb_render_view(view_id, domain)
是客户端调用的方法,将调用上下文准备方法,最终调用env['ir.qweb'].render()
。
搜索¶
搜索视图与以前的视图类型不同,它们不显示 内容:虽然它们适用于特定模型,但它们用于过滤其他视图的内容(通常是聚合视图,例如 列表 或 图表)。除了用例的差异外,它们的定义方式相同。
搜索视图的根元素是 <search>
。它不带任何属性。
搜索视图的可能子元素包括:
field
fields 定义了使用用户提供的值的域或上下文。当生成搜索域时,字段域会与彼此和过滤器一起使用 AND 进行组合。
字段可以具有以下属性:
name
筛选字段的名称
string
字段标签
operator
默认情况下,字段生成的域的形式为:
[(name, operator, provided_value)]
,其中name
是字段的名称,provided_value
是用户提供的值,可能经过过滤或转换(例如,用户应该提供选择字段值的 标签 ,而不是值本身)。The
operator
attribute allows overriding the default operator, which depends on the field’s type (e.g.=
for float fields butilike
for char fields)filter_domain
完整的域名,用作字段的搜索域,可以使用
self
变量将提供的值注入到自定义域中。可用于生成比operator
单独更灵活的域(例如,同时在多个字段上进行搜索)如果同时提供了
operator
和filter_domain
,则filter_domain
优先。context
允许添加上下文键,包括用户提供的值(与
domain
一样,作为self
变量可用,例如[id_1, id_2]
用于Many2one
字段)。默认情况下,字段不生成域。注解
域和上下文是包容的,如果指定了
context
,则两者都会生成。要仅生成上下文值,请将filter_domain
设置为空列表:filter_domain="[]"
groups
将该字段仅对特定用户开放
domain
如果字段可以提供自动完成(例如
Many2one
),则过滤可能的完成结果。
filter
过滤器是搜索视图中预定义的开关,只能启用或禁用。它的主要目的是向搜索上下文(传递给数据视图进行搜索/过滤的上下文)添加数据,或向搜索过滤器附加新部分。
过滤器可以具有以下属性:
string
(required)筛选器的标签
domain
(optional)一个 Odoo domain,将会作为搜索域的一部分,附加到动作的域中。
date
(optional)字段的名称为
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
(optional)只对具有非空
date
属性的过滤器有意义。确定在视图初始化时激活的默认过滤器集合中,哪些时间段被激活。如果未提供,默认使用 ‘this_month’。可以从以下选项中选择:今天,本周,本月,上个月,上上个月,第四季度,第三季度,第二季度,第一季度,今年,去年,前年。
该属性接受逗号分隔的值。
例子:
<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
时,过滤器会生成一个子菜单,其中包含以下间隔选项:day, week, month, quarter, year.如果筛选器在视图初始化时处于默认筛选器集中,则记录默认按月份分组。可以使用以下示例中的语法“date_field:interval”进行更改。
例子:
<filter name="groupby_create_date" string="Creation Date" context="{'group_by': 'create_date:week'}"/>
注解
对于按字段分组的 read_groups 结果可能会受到其 group_expand 属性的影响,允许在需要时显示空组。有关更多信息,请参阅
Field
属性文档。name
help
筛选器的更长的解释性文本,可以显示为工具提示
groups
将筛选器仅限制为特定用户可用
小技巧
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 的记录。注解
XML 不允许在 XML 元素中使用
<
,应该使用实体引用(<
)代替。separator
可以用于在简单搜索视图中分隔过滤器组
group
可以用于分隔筛选器组,在复杂的搜索视图中更易读,比
separator
更好searchpanel
允许在任何多记录视图的左侧显示搜索面板。默认情况下,列表视图和看板视图启用了搜索面板。可以使用属性在其他视图上激活搜索面板:
view_types
一个逗号分隔的视图类型列表,用于启用搜索面板,默认为’tree,kanban’
这个工具允许根据给定的字段快速过滤数据。字段被指定为
searchpanel
的直接子元素,标签名为field
,并具有以下属性:name
(mandatory)筛选字段的名称
select
确定行为和显示方式。可能的值为:
one
(default) at most one value can be selected. Supported field types are many2one and selection.multi
several values can be selected (checkboxes). Supported field types are many2one, many2many and selection.
groups
限制特定用户
string
确定要显示的标签
icon
指定使用哪个图标
color
确定图标颜色
在
multi
情况下,还有其他可选属性可用:enable_counters
default为false。如果设置为true,则会计算并显示记录计数器(如果非零)。
如果性能太差,此功能已实现。
解决性能问题的另一种方法是正确地覆盖
search_panel_select_range
和search_panel_select_multi_range
方法。expand
default为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
: field name of the comodel (only available for many2one and many2many fields). Values will be grouped by that field.
搜索默认值¶
搜索字段和过滤器可以通过操作的 context
使用 search_default_name
键进行配置。对于字段,值应该是要设置在字段中的值,对于过滤器,它可以是布尔值或数字。例如,假设 foo
是一个字段, bar
是一个过滤器,一个操作的上下文为:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
将自动启用 bar
过滤器,并搜索 foo
字段中的 acro。
可以使用一个数值(介于1和99之间)来描述默认分组的顺序。例如,如果 foo
和 bar
指代两个分组
{
'search_default_foo': 2,
'search_default_bar': 1
}
具有先激活 bar
然后激活 foo
的效果。