odoo13学习 odoo的视图

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.继承
继承的字段:
下面两个视图字段用于指定继承的视图

  • inherit_id , Many2one
    前视图的父视图,默认情况下未设置。使用ref属性指定父节点
<field name="inherit_id" ref="library.view_book_form"/>
  • mode Selection: extension / primary
    继承模式,如果设置了inherit_id,则默认为扩展,否则为primary。
    当使用inherit_id时,你想覆盖模式的一个例子是委托继承。在这种情况下,你的派生模型将与它的父模型分离,与一个视图匹配的视图将不会与另一个匹配。假设您从与父模型关联的视图中继承,并希望自定义派生视图以显示来自派生模型的数据。派生视图的模式需要设置为primary,因为它是派生模型的基础(可能是唯一的)视图。否则视图匹配

5.视图匹配

  • 如果视图是由(model, type)请求的,则匹配具有正确的模型和类型、mode=primary和最低优先级的视图。
  • 当视图被id请求时,如果它的模式不是主模式,则匹配与主模式最接近的父模式。

6.视图区别/分辨
视图的区别主要是生成不同类型的视图

  • 如果视图有父视图,则父视图被完全解析,然后应用当前视图的继承规范
  • 如果视图没有父视图,则按原样使用其arch
  • 使用模式扩展查找当前视图的子视图,并应用它们的继承规范深度优先(应用子视图,然后应用其子视图,然后应用兄弟视图)。

应用子视图的结果产生最终的arch

7.继承规格
继承规范由元素定位器和子元素组成,前者与父视图中的继承元素相匹配,后者将用于修改继承元素。
下面是匹配目标元素的三种类型的元素定位器:

  • 带有expr属性的xpath元素。expr是应用于当前arch的XPath表达式1,它找到的第一个节点是匹配的
  • 具有name属性的字段元素匹配具有相同名称的第一个字段。在匹配过程中忽略所有其他属性
  • 任何其他元素:匹配具有相同名称和相同属性(忽略位置和版本属性)的第一个元素
<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 (default):继承的内容被附加到匹配的节点
  • replace:继承的内容替换匹配的节点。任何在规范内容中只包含$0的文本节点都将被匹配节点的完整副本替换,从而有效地包装匹配节点
  • after:继承的内容被添加到匹配节点的父节点,在匹配节点之后
  • before:继承的内容在匹配节点之前被添加到匹配节点的父节点
  • attributes:继承的内容应该是带有name属性和可选主体的属性元素:
    如果属性元素有一个body,则在匹配的节点上创建一个以其名称命名的新属性,属性元素的文本作为值
    如果属性元素没有主体,则以其名称命名的属性将从匹配节点中删除。如果不存在这样的属性,则会引发错误
<field name="sale_information" position="attributes">
  <attribute name="invisible">0attribute>
  <attribute name="attrs">
    {'invisible': [('sale_ok', '=', False)], 'readonly': [('editable', '=', False)]}
  attribute>
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>

8.View types:视图的类型

  • Activity 活动视图):用于显示链接到记录的活动。数据显示在一个图表中,记录构成行,活动类型构成列。每行的第一个单元格显示一张(可自定义的,参见模板,与看板非常类似)卡片,表示相应的记录。当单击其他单元格时,记录中相同类型的所有活动的详细描述将显示出来。
 Activity视图的根元素是< Activity >,它接受以下属性:
 	string :一个标题,用它描述视图
 视图的子元素有:
 field:声明要在活动逻辑中使用的字段。如果字段只是简单地显示在activity视图中,则不需要预先声明它。name (required)要获取的字段的名称。
 templates:定义QWeb模板。为了清晰起见,卡片定义可以拆分为多个模板,但是活动视图必须定义至少一个根模板活动框,它将为每个记录呈现一次。activity视图使用标准的javascript qweb,并提供了以下上下文变量。
 widget:当前的ActivityRecord()可以用来获取一些元信息。这些方法也可以直接在模板上下文中使用,不需要通过小部件访问
 record:具有所有请求字段作为其属性的对象。每个字段有两个属性value和raw_value
  • 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:启用单击时快速事件创建:只询问用户名称,并尝试创建一个新的事件,仅使用该名称和单击事件时间。如果快速创建失败,将返回到完整的表单对话框
 all_day:记录上布尔字段的名称,该名称指示是否将相应的事件标记为day-long(与持续时间无关)
 mode:加载日历时的默认显示模式。可能的属性是:day、week、month
 
 <field>:声明要聚合或在看板逻辑中使用的字段。如果字段仅仅显示在日历卡中。
 字段可以有额外的属性:
 * invisible :使用“True”来隐藏卡片中的值
 * avatar_field:仅对x2many字段,显示头像而不是卡片中的display_name
 * write_model 和 write_field:您可以添加筛选器并将结果保存到定义的模型中,该筛选器将添加到侧栏中
  • Cohort 视图
    Cohort视图 用于显示和理解一些数据在一段时间内的变化方式。例如,假设对于给定的业务,客户端可以订阅某些服务。队列视图可以显示每个月的订阅总数,并研究客户离开服务的速率(churn)。当点击一个单元格时,队列视图将重定向到一个新的动作,在这个动作中,你将只能看到包含在单元格的时间间隔中的记录;该操作包含一个列表视图和一个表单视图。
<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 视图
    与pivot和graph视图一样,仪表板视图也用于显示聚合数据。然而,仪表板可以嵌入子视图,这使得在给定数据集上有一个更完整和有趣的外观成为可能。仪表板视图可以显示子视图、某些字段的聚合(在一个域上),甚至公式(涉及一个或多个聚合的表达式)。例如,这是一个非常简单的仪表盘:
<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

  • Diagram 视图:图表视图
    diagram视图可用于显示记录的有向图。根元素是,没有属性。
    图视图可能的子视图有:
node (required, 1):属性有:object/shape/bgcolor
arrow (required, 1):属性有:object (required)/source (required)/destination (required)/label
label:对于图表,string属性定义了注释的内容。每个标签在图表头部作为一个段落输出,很容易看到,但没有任何特别的强调。
  • Form 视图:表单视图用于显示来自单个记录的数据。它们的根元素是< form >。它们由常规HTML和附加的结构和语义组件组成。

结构构件):结构组件提供了结构或“可视化”特性,几乎不需要逻辑。它们被用作表单视图中的元素或元素集。

 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>
  • Gantt 视图
    甘特视图适当地显示甘特图(用于调度)。
    gantt视图的根元素是,它没有子元素,但可以接受以下属性:
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>
  • Graph 视图: 图表视图
    图形视图用于可视化多个记录或记录组上的聚合。它的根元素是 < graph > ,它可以接受以下属性:
type:柱状图(默认)、饼状图和线状图之一,是要使用的图形类型
stacked:只用于条形图。如果存在并设置为True,则堆叠组内的条
name (required):
title (optional):显示在图形顶部的字符串
type:row (default)/col/measure
interval:在date和datetime字段中,按指定的间隔(日,周,月,季度或年)分组,而不是按特定的datetime(固定的第二分辨率)或日期(固定的日分辨率)分组
  • Kanban :看板视图
    看板视图是一种看板可视化:它将记录显示为“卡片”,介于列表视图和不可编辑表单视图之间。记录可以分组成列,以用于工作流可视化或操作(例如,任务或工作进度管理),或未分组(仅用于可视化记录)
    板视图的根元素是< kanban >,它可以使用以下属性:
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"/> 
    
  • Map视图
    这个视图能够在地图上显示记录以及它们之间的路线。记录由引脚表示。它还允许在一个绑定到记录大头针的弹出窗口中可视化来自模型的字段。
    视图的根元素是< map>可以有多个属性
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>
  • Pivot 透视图
    透视视图用于将聚合可视化为透视表。它的根元素是,它可以接受以下属性
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
    QWeb视图是一个视图arch中的标准QWeb模板。它们没有特定的根元素。因为QWeb视图没有一个特定的根元素,它们的类型必须显式指定(不能从arch字段的根元素推断)。

QWeb views 有两个用例:
*1.它们可以用作前端模板,在这种情况下,模板应该用作快捷方式。
2.它们可以被用作实际的qweb视图(在操作中打开),在这种情况下,它们应该被定义为带有显式类型(不能推断)和模型的常规视图。
对基本的qweb-as-template的qweb-as-view增加的主要内容是:

  1. qweb-as-view有一个特殊的情况下,元素的CSS类o_qweb_cp_buttons:它的内容应该是按钮,并将被提取和移动到控制面板的按钮区域,本身将被删除,这是一个解决方案,控制面板视图还不存在
  2. qweb-as-view呈现为标准的qweb呈现上下文添加了几个项:
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()
  • Search 视图
    搜索视图与以前的视图类型有所不同,因为它们不显示内容:尽管它们适用于一个特定的模型,但它们被用来过滤其他视图的内容(通常是聚合的视图,如列表或图)。除了用例的不同之外,它们的定义方式是相同的。
    搜索视图的根元素是。它没有属性。
    搜索视图可能的子元素有:
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
}

你可能感兴趣的:(odoo)