1. odoo的基本视图结构
基本视图通常共享下面定义的公共结构。占位符用全大写表示。
<record id="MODEL_view_TYPE" model="ir.ui.view">
<field name="name">NAMEfield>
<field name="model">MODELfield>
<field name="arch" type="xml">
<VIEW_TYPE>
<VIEW_SPECIFICATIONS/>
VIEW_TYPE>
field>
record>
2.字段
视图对象公开许多字段。它们是可选的,除非另有说明。
name —>char:只有在从某种类型的列表中查找视图时,才可用作视图的助记符/描述。
model —>char:模型链接到视图,如果适用的话。
priority —>Integer:当视图被(model, type)请求时,将返回与模型和类型匹配且优先级最低的视图(这是默认视图)。它还定义了视图继承期间视图应用程序的顺序。
groups_id —>Many2many: odoo.addons.base.models.res_users.Groups
组允许 use/access 当前视图。
如果视图扩展了一个现有视图,那么只有当用户能够访问提供的groups_id时,该扩展才会应用于给定的用户。
arch —> Text:视图布局的描述。
3.属性
不同的视图类型有各种各样的属性,允许对通用行为进行定制。这里将解释一些主要属性。它们并不是对所有视图类型都有影响。
ps:当前上下文和用户访问权限也可能影响查看能力。
create:在视图上 禁用/启用 记录创建。
edit (form & list & gantt) : 在视图上 禁用/启用 记录版本。
delete (form & list) : 通过Action下拉菜单 禁用/启用 视图上的记录删除。
duplicate (form & list) : 通过操作下拉菜单禁用/启用视图上的记录复制
decoration-$ (list & gantt) : 根据相应记录的属性,以行文本的样式定义记录的条件显示。值是Python表达式。对于每个记录,表达式将使用记录的属性作为上下文值进行计算,如果为真,相应的样式将应用于行。其他上下文值是uid(当前用户的id)和current_date(当前日期作为YYYY-MM-DD格式的字符串)。
<tree decoration-info="state == 'draft'"
decoration-danger="state == 'help_needed'"
decoration-bf="state='busy'">
<TREE_VIEW_CONTENT>
tree>
banner_route: 要获取并预先添加到视图中的路由地址。
如果设置了这个属性,控制器路由url将被获取并显示在视图之上。来自控制器的json响应应该包含一个“html”键。
如果html包含一个样式表< link >标签,它将被移除并附加到 < head >
只有扩展了AbstractView和AbstractController的视图才能使用这个属性,比如表单、看板、列表……
Example:
<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': """
hello, world
"""
}
4.继承
继承的字段:
下面两个视图字段用于指定继承的视图
<field name="inherit_id" ref="library.view_book_form"/>
5.视图匹配
6.视图区别/分辨
视图的区别主要是生成不同类型的视图
应用子视图的结果产生最终的arch
7.继承规格
继承规范由元素定位器和子元素组成,前者与父视图中的继承元素相匹配,后者将用于修改继承元素。
下面是匹配目标元素的三种类型的元素定位器:
<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属性来指定如何改变匹配的节点:
<field name="sale_information" position="attributes">
<attribute name="invisible">0attribute>
<attribute name="attrs">
{'invisible': [('sale_ok', '=', False)], 'readonly': [('editable', '=', False)]}
attribute>
field>
<xpath expr="//@target" position="after">
<xpath expr="//@node" position="move"/>
xpath>
<field name="target_field" position="after">
<field name="my_field" position="move"/>
field>
8.View types:视图的类型
Activity视图的根元素是< Activity >,它接受以下属性:
string :一个标题,用它描述视图
视图的子元素有:
field:声明要在活动逻辑中使用的字段。如果字段只是简单地显示在activity视图中,则不需要预先声明它。name (required)要获取的字段的名称。
templates:定义QWeb模板。为了清晰起见,卡片定义可以拆分为多个模板,但是活动视图必须定义至少一个根模板活动框,它将为每个记录呈现一次。activity视图使用标准的javascript qweb,并提供了以下上下文变量。
widget:当前的ActivityRecord()可以用来获取一些元信息。这些方法也可以直接在模板上下文中使用,不需要通过小部件访问
record:具有所有请求字段作为其属性的对象。每个字段有两个属性value和raw_value
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:启用单击时快速事件创建:只询问用户名称,并尝试创建一个新的事件,仅使用该名称和单击事件时间。如果快速创建失败,将返回到完整的表单对话框
all_day:记录上布尔字段的名称,该名称指示是否将相应的事件标记为day-long(与持续时间无关)
mode:加载日历时的默认显示模式。可能的属性是:day、week、month
<field>:声明要聚合或在看板逻辑中使用的字段。如果字段仅仅显示在日历卡中。
字段可以有额外的属性:
* invisible :使用“True”来隐藏卡片中的值
* avatar_field:仅对x2many字段,显示头像而不是卡片中的display_name
* write_model 和 write_field:您可以添加筛选器并将结果保存到定义的模型中,该筛选器将添加到侧栏中
<cohort string="Subscription" date_start="date_start" date_stop="date" interval="month"/>
属性:
string (mandatory):一个标题,描述视图
date_start (mandatory):有效的日期或日期时间字段。视图将此字段理解为记录的开始日期
date_stop (mandatory):有效的日期或日期时间字段。视图将此字段理解为记录的结束日期。这是将决定流失率的字段。
mode (optional):用于描述模式的字符串。它应该是“流失率”或“留存率”(默认)。流失率模式将从0%开始并随着时间的推移而累积,而留存率将从100%开始并随着时间的推移而减少。
timeline (optional):用于描述时间轴的字符串。它应该是“向后”或“向前”(默认)。向前时间轴将显示数据从date_start到date_stop,而向后时间轴将显示数据从date_stop到date_start(当date_start在future /大于date_stop)。
interval (optional):用于描述时间间隔的字符串。应该是' day ', ' week ', ' month '(默认)或' year '。
measure (optional):可以聚合的字段。此字段将用于计算每个单元格的值。如果没有设置,队列视图将计算出现的次数。
<dashboard>
<view type="graph" ref="sale_report.view_order_product_graph"/>
<group string="Sale">
<aggregate name="price_total" field="price_total" widget="monetary"/>
<aggregate name="order_id" field="order_id" string="Orders"/>
<formula name="price_average" string="Price Average"
value="record.price_total / record.order_id" widget="percentage"/>
group>
<view type="pivot" ref="sale_report.view_order_product_pivot"/>
dashboard>
仪表板视图的根元素是< Dashboard >,它不接受任何属性。
在仪表板视图中有5种可能的标签类型:view group aggregate formula widget
每个标签又有很多属性详情查阅:https://www.odoo.com/documentation/13.0/reference/views.html#dashboard
node (required, 1):属性有:object/shape/bgcolor
arrow (required, 1):属性有:object (required)/source (required)/destination (required)/label
label:对于图表,string属性定义了注释的内容。每个标签在图表头部作为一个段落输出,很容易看到,但没有任何特别的强调。
结构构件):结构组件提供了结构或“可视化”特性,几乎不需要逻辑。它们被用作表单视图中的元素或元素集。
notebook:定义一个选项卡节。每个选项卡都是通过页面子元素定义的。页面可以有以下属性:
1:string(必需)标签的标题
2:accesskey 一个HTML accesskey
3:attrs 基于记录值的标准动态属性
group:用于定义表单中的列布局。
1: newline只在组元素中有用,提前结束当前行并立即切换到新行(无需预先填充任何剩余列)
2: separator 小的水平间距,一个字符串属性表现为一个章节标题
3: sheet 是否可以作为一个直接的子窗体,以形成一个更窄和响应性更好的窗体布局
4:header 与工作表相结合,在工作表本身之上提供一个全宽位置,通常用于显示工作流按钮和状态小部件
语义成分) 语义组件与Odoo系统结合并允许交互。可用的语义组件有
button:调用进入Odoo系统,类似于列表视图按钮。此外,还可以指定以下属性:
1:special 对于在对话框中打开的表单视图:保存以保存记录并关闭对话框,取消以关闭对话框而不保存。
2: confirm 在执行按钮的Odoo调用之前显示(并让用户接受)的确认消息(也适用于看板视图)。
field:呈现(并可能允许编辑)当前记录的单个字段。多次使用表单视图中的字段是受支持的,并且字段可以接收“不可见”和“只读”修饰符的不同值。但是,当多个字段具有不同的修饰符“required”值时,不保证该行为。字段节点的可能属性为
1: name (mandatory) 要呈现的字段的名称
2: widget 字段有一个基于其类型的默认呈现(例如Char, Many2one)。小部件属性允许使用不同的呈现方法和上下文。
3: options JSON对象,指定字段小部件(包括默认小部件)的配置选项
4: class HTML类要设置在生成的元素上,常用字段类有:oe_inline oe_left, oe_right oe_read_only, oe_edit_only oe_avatar
....
结构):
<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>
date_start (required)
date_stop (required)
color
decoration-{$name}
default_group_by
consolidation
consolidation_max
consolidation_exclude
create, edit, plan
offset
progress
string
precision
total_row
collapse_first_level
display_unavailability
default_scale
scales
templates
form_view_id
thumbnails
<gantt
date_start="date_start"
date_stop="date_stop"
thumbnails="{'user_id': 'image_128'}"
>
gantt>
type:柱状图(默认)、饼状图和线状图之一,是要使用的图形类型
stacked:只用于条形图。如果存在并设置为True,则堆叠组内的条
name (required):
title (optional):显示在图形顶部的字符串
type:row (default)/col/measure
interval:在date和datetime字段中,按指定的间隔(日,周,月,季度或年)分组,而不是按特定的datetime(固定的第二分辨率)或日期(固定的日分辨率)分组
default_group_by
default_order
class
examples
group_create
group_delete
archivable
quick_create
quick_create_view
records_draggable
field:name (required)
progressbar:声明一个progressbar元素放在看板列的顶部:field (required) /colors (required)/ sum_field (optional)
templates
widget
record
context
user_context
read_only_mode
selection_mode
List 视图
列表视图的根元素是< tree>。列表视图的根可以有以下属性:
editable:默认情况下,选择列表视图的行将打开相应的表单视图。可编辑属性使列表视图本身就地可编辑。
有效值分别为top和bottom,这使得新记录分别出现在列表的顶部或底部。
内联表单视图的体系结构是从列表视图派生出来的。表单视图的字段和按钮上有效的大多数属性因此被列表视图接受,尽管如果列表视图不可编辑,它们可能没有任何意义
multi_edit:可编辑或不可编辑列表可以通过定义multi_edit=1来激活多版本特性
default_order:重写视图的顺序,替换模型的order (_order模型属性)。该值是一个以逗号分隔的字段列表,以desc作为后缀,以便按相反顺序排序:
<tree default_order="sequence,name desc">
decoration-{$name}:允许基于相应记录的属性更改行文本的样式。
create, edit, delete, duplicate, import, export_xlsx:
limit:页面的默认大小。它必须是一个正整数
groups_limit:当列表视图被分组时,页面的默认组数。它必须是位置整数
expand:当列表视图分组时,如果设置为true(默认值:false),则自动打开第一级组。
button:在列表单元格中显示一个按钮:icon/string/type/。。。。
field:
groupby:
<groupby name="partner_id">
<field name="name"/>
res_partner/ default_order/ routing /name /string
例如:
<map res_partner="partner_id" default_order="date_begin" routing="true">
<marker-popup>
<field name="name" string="Task: "/>
marker-popup>
map>
disable_linking/display_quantity/default_order
<pivot default_order="foo asc">
<field name="foo" type="measure"/>
pivot>
pivot视图中唯一允许的元素是字段,它可以具有以下属性:
name (required):
string:
type:row (default)/col/measure/interval
invisible:
例如,时间表轴心视图可以定义为:
<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 views 有两个用例:
*1.它们可以用作前端模板,在这种情况下,模板应该用作快捷方式。
2.它们可以被用作实际的qweb视图(在操作中打开),在这种情况下,它们应该被定义为带有显式类型(不能推断)和模型的常规视图。
对基本的qweb-as-template的qweb-as-view增加的主要内容是:
model:qweb视图绑定到的模型
domain:由搜索视图提供的域
context:由搜索视图提供的上下文
records:model.search(域)的延迟代理,如果您只想迭代记录而不执行更复杂的操作(如分组),可以使用它。
3.qweb-as-view还提供了额外的渲染钩子:
_qweb_prepare_context(view_id,域)准备特定于qweb-as-view的呈现上下文
qweb_render_view(view_id, domain)是客户端调用的方法,它将调用上下文准备方法,并最终调用env['ir.qweb'].render()
field:属性有:name /string/operator/filter_domain/context/groups/widgetdomain
filter:属性有 string (required)/ domain (optional)/ date (optional)/default_period (optional)/context /name /help /groups
<filter name="filter_create_date" date="create_date" string="Creation Date"/>
<filter name="filter_create_date" date="create_date" string="Creation Date" default_period="this_week"/>
separator:
group:
searchpanel:
搜索默认值配置:搜索字段和过滤器可以使用search_default_name键通过操作的上下文配置。对于字段,值应该是要在字段中设置的值,对于过滤器,它是一个布尔值或数字。例如,假设foo是一个字段,bar是一个动作上下文的过滤器
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
将自动启用栏过滤器和搜索foo字段的acro。
一个数值(在1到99之间)可以用来描述默认组的顺序。例如,如果foo和bar指向两个组
{
'search_default_foo': 2,
'search_default_bar': 1
}