Odoo 12开发之后台视图 – 设计用户界面 ###

Odoo 12开发之后台视图 – 设计用户界面

一·菜单项

# 菜单项形成一个层级结构,最顶层结构
#   name 是展示在用户界面中的菜单标题
# 	action 是点击菜单时运行的窗口
#   parenter 是父级菜单项XML ID
#   sequence 设置一个数字来在展示菜单项时进行排序. 如sequence="10"
#   groups 用来都好分割可访问菜单安全组的xml ID列表
#   web_icon 菜单项的图标
<menuitem id="menu_library_checkout"
        name="Checkout"
        action="action_library_checkout"
        parent="library_app.menu_library" />

二·窗口操作(Window Actions)

# 通常用于菜单项或视图中的按钮.
# 窗口操作存储在ir.actions.act_window模型中.
# 可通过域过滤器过滤出可用的记录,设置默认值以及从上下文属性中过滤

# name 是视图显示的标题
# res_model是目标模型的标识符
# view_mode是一个逗号分割的可用视图类型列表
# target 是设置对话窗口打开方式,如target="new",默认是current
# context 是视图设置上下文信息. 可设置默认值或者启用过滤器等.context=”{‘default_user_id’: uid}”
# domain 是对可在视图种浏览的记录强制过滤,domain="[('user_id','=',uid)]"
# limit  列表视图每页显示的记录数
# src_model  设置Action所作用的模型,例如src_model=”library.checkout”
# 
    <act_window id="action_library_checkout"
        name="Checkouts"
        res_model="library.checkout"
        view_mode="tree,form,activity,calendar,graph,pivot" />

三·表单视图结构

业务文档视图
# 业务应用中记录的很多数据可以按纸质文档那样展示
# 视图的基本框架:包含 form , header , sheet 和 mail 
# 	header 状态栏, 
	sheet主内容 , 
	底部交流区 也称作chatter,需要继承mail.thread和mail.activity.mixin

<record id="view_form_checkout" model="ir.ui.view">
    <field name="model">library.checkout</field>
    <field name="arch" type="xml">
        <form>
            <header>
                <!--以下仅供查看效果使用-->
                <field name="state" widget="statusbar" clickable="True" />
            </header>
            <sheet>
                ...
            </sheet>
            <div class="oe_chatter">
                <field name="message_follower_ids" widget="mail_followers" />
                <field name="activity_ids" widget="mail_activity" />
                <field name="message_ids" widget="mail_thread" />
            </div>
        </form>
    </field>
</record>
头部 Header
头部header 通常用于文档所走过的生命周期或步骤,还包含相关的操作按钮。这些按钮是普通表单按钮,最重要的下一步可以高亮显示。
头部按钮
<header>
    <field name="state" invisible="True" />
    <button name="button_done"
            string="Return Books"
            attrs="{'invisible':
                   [('state', 'in', ['new', 'done'])]}"
            class="oe_highlight" />
</header>
# domain 或 attrs 表达式中使用的字段必须在视图中加载,作用于它们的<field>元素。如果字段不对用户可见,则必须以不可见字段元素对其进行加载。

#state字段, 相同的效果可以通过states字段属性实现.虽然没有attrs属性灵活,states更为精简
<button name="button_done"
        type="object"
        string="Returned"
        states="open,cancel"
        class="oe_highlight" />
# attrs和states元素可见功能也可用于其它视图元素
阶段管道
# 是statusbar组件的stage_id字段的<field>元素
# 通常状态或者阶段字段是一个many-to-on字段,允许使用者点击,clickable属性变更状态.
# 也可将状态隐藏折叠,通常命名为fold,然后statusbar组件使用options属性来将这一字段名提供给fold_field
<header>
    <field name="stage_id"
           widget="statusbar"
           clickable="True"
           options="{'fold_field': 'fold'}" />
</header>
状态代替阶段
需要使用statusbar_visible属性来替换fold_field选项
<field name="state"
       widget="statusbar"
       clickable="True"
       statusbar_visible="draft,open,done" />
文档表单
# 设计类似一张真实的纸质文档,
# 包含:
    左上角文档标题和副标题
    右上角按钮区
    其它文档头部字段
    底部笔记区,将附加字段组织成选项卡或页面

标题和副标题
# 一般标题放在oe_title类中。以下为扩展后的<sheet>元素,它包含标题以及一些额外字段如副标题
<field name="member_image" widget="image" class="oe_avatar" />
<div class="oe_title">
    <label for="member_id" class="oe_edit_only" />
    <h1><field name="member_id" /></h1>
    <h3>
        <span class="oe_read_only">By </span>
        <label for="user_id" class="oe_edit_only" />
        <field name="user_id" class="oe_inline" />
    </h3>
</div>
<!-- More elements will be added from here... -->
</sheet>
表单内容分组
# 表单主内容区应通过<group>标签来进行组织。
# <group>标签在画布中插入了两列。
# 默认在这些列中标签会在字段旁显示,因此又占据两列。
# 字段加标签会占据 一行,下一个字段和标签又会另起一行,垂直排列。
# Odoo表单的常见布局是带标签的字段并排成两列。达到这一效果,我们只需要添加两个嵌入顶部的<group>标签。
<group name="group_top">
    <group name="group_col1">
        <field name="user_id" />
        <field name="checkout_date" />
    </group>
    <group name="group_col2">
        <field name="state" />
        <field name="closed_date" />
    </group>
</group>
选项卡笔记本(Tabbed notebooks)
# 组织内容的方式是 notebook 元素,一个包含多个称为页面(page)的选项卡分区的容器
# 它们可以让不常用的内容在不使用时隐藏起来,或者用于按话题组织大量字段。
# page支持以下属性:
    string:选项卡的标题(必填)
    attrs:不可见属性与表达式映射的字典
    accesskey:HTML访问密钥
<notebook>
    <page string="Borrowed Books" name="page_lines">
        <field name="line_ids" />
    </page>
</notebook>

四·字段

# 视图字段可用属性
	name # 标识字段数据库中名称
    string # 用于想要覆盖模型中标签文本的标签文本
    help # 是鼠标悬停在字段上显示的提示文本,它允许我们覆盖模型定义中提供的帮助文本
    placeholder # 是在字段中显示的提示文本
    widget # 让我们可以覆盖字段的默认组件,一会儿我们就会讲到可用的组件
    options # 是一个带有组件附加数据的JSON数据结构,值随各组件的不同支持而不同
    class # 是用于字段 HTML 渲染的CSS类
    nolabel=”True”  #  阻止自动字段标签的展示。仅对<group>元素内的字段有作用,通常与<label for=”…”>元素一起使用。
    invisible=”True” # 让字段不可见,但仍会从服务端获取数据并可在表单中使用
    readonly=”True” # 让表单中该字段不可编辑
    required=”True” # 让表单中该字段为必填
    password=”True” #  用于文本字段。显示为密码项,隐藏所输入文字
	filename # 用于二进制字段,它是用于存储上传文件名的模型字段的名称
字段标签
# <label>元素可用于更好地控制字段标签的展示
# 例子:是仅在表单为编辑模式时展示
	<label for="name" class="oe_edit_only" />
# 注意:在group元素内部,通常设置nolabel="True",class='oe_edit_only'的css样式

字段组件
### 对于文本字段
	mail # 用于让 email 文本成为可操作的”mail-to”地址
    url # 用于将文本格式化为可点击的URL
    html # 用于将文本渲染为HTML内容;在编辑模式下,它显示为一个WYSIWYG(所见即所得)编辑器,可在不使用 HTML 代码的情况下格式化内容。

### 对于数字字段,有以下组件:
    handle # 在列表视图中作为一个排序字段,显示一个句柄来让我们可以拖放进行自定义排序
    float_time # 将一个浮点型字段格式化为带有小时和分钟的值
    monetary # 将一个浮点型字段显示为货币金额。它与currency_id字段一起使用,还可以通过options=”{‘currency_field’: ‘currency_id’}”来使用另一个字段名
    progressbar # 将一个浮点值显示为进度条百分比,有助于将字段展示为完成率
    percentage和percentpie # 组件可用于浮点型字段

### 对于关联和选择项字段,有以下附加组件:
    many2many_tags # 将值显示为按钮标签列表
    many2many_checkboxes # 将选项值显示为一个复选框列表
    selection对many-to-one # 字段使用选择字段组件
    radio # 以单选按钮显示选择字段选项
    priority # 将选项字段显示为一个可点击星形列表。选择项目通常是数值。
    state_selection # 将看板状态选择列表显示为信号灯。普通状态显示为灰色,完成显示为绿色,其它状态显示为红色。
    pdf_viewer # 是一个二进制字段(在 Odoo 12中引入)。
    
    
# state_selection在 Odoo11中引入来替换掉kanban_state_selection。后者被淘汰,但为保持向后兼容性,还支持使用。    
关联字段
#  默认用户从这些字段中创建新记录(也称作“快速创建”)并打开关联记录表单。可通过options字段属性来关闭:
	options="{'no_open': True, 'no_create': True}"

# context和domain也是字段属性并对于关联字段特别有用
	context可定义关联字记录默认值
    domain 可限制可选记录
    
    
# 如果想要在列表视图的表单弹出窗口中直接编辑one-to-many路线,应使用<tree editable=”top”>或<tree editable=”bottom”>    

五·按钮

普通按钮
# 按钮支持的属性
    string # 是按钮文本标签或使用图标时的 HTML alt 文本
    type # 是执行操作的类型,有以下值:
    object # 用于调用 Python 方法
    action # 用于运行窗口操作
    name # 标识按所选类型要操作的具体的操作,要么是模型方法名,要么是要运行的窗口操作的数据库 ID。可使用%(xmlid)d方程式来将XML ID转换成加载视图时所需的数据库 ID。
    args在类型为 object 时用于向方法传递额外的参数,须是在形成方法调用参数的记录 ID 之后所添加的纯静态 JSON 参数。
    context # 在上下文中添加值,可在窗口操作或 Python 代码方法调用之后产生效果。
    confirm # 在运行相关操作之前显示确认消息框,显示的内容是属性中分配的文本。special=”cancel”用于向导表单。
    icon # 是按钮所显示的图标。可用的按钮来自Font Awesome图标集,版本为4.7.0,应通过对应的 CSS 类来指定,如icon=”fa-question”。更多信息可访问Font Awesome。
智能按钮
# 智能按钮(smart button) 智能按钮显示为带有数据指示的矩形,在点击时可进入
#  智能按钮通常是sheet的第一个元素,且带有oe_button_box样式.


### 注意:
	# 1. 智能按钮必须带有class=”oe_stat_button” CSS样式,
    # 2. 并应使用 icon 属性来带有一个图标。
    # 3. 它有一个type=”action”,表示点击按钮时将运行通过 name 属性标识的窗口操作。%(action_other_checkouts_button)d表达式返回要运行的操作的数据库 ID

### 智能按钮属性值:
	class=”oe_stat_button”  # 渲染的不是普通按钮而是一个矩形
	icon  # 从Font Awesome图标集中选择图标来使用。访问Font Awesome查看有哪些图标。
	type和name  # 是按钮类型以及触发的操作名。对于智能按钮,类型通常是 action,指定窗口操作,名称为所要执行操作的 ID。应传入真实数据库 ID,因此我们要使用方程式来将XML ID转换为数据库 ID:”%(actionxmlid)d”。这一操作应该会打开带有关联记录的视图。
	string  # 按钮添加标签文本,这里没有使用因为所包含的字段中已经提供了文本。
	context  # 应用于为目标视图设置默认值,用于点击按钮后视图上新建的记录。
	help   # 在鼠标悬停在按钮上显示帮助提示信息
num_other_checkouts = fields.Integer(compute='_compute_num_other_checkouts')

def _compute_num_other_checkouts(self):
	for rec in self:
        domain = [('member_id', '=', rec.member_id.id),
        ('state', 'in', ['open']),
        ('id', '!=', rec.id)]
		rec.num_other_checkouts = self.search_count(domain)
<div name="button_box" class="oe_button_box">
    <button class="oe_stat_button"
            icon="fa-tasks"
            help="Other checkouts pending return."
            type="action"
            name="%(action_other_checkouts_button)d"
            context="{'default_member_id': member_id}">
        <field string="To Return"
               name="num_other_checkouts"
               widget="statinfo" />
    </button>
</div>

六·动态视图元素

onchange 事件
# 通过@api.onchange('field1',...)装饰器创建模型
# onchange 机制还可以在用户输入时即时反馈进行计算字段的自动重算
动态属性
# 属性允许根据记录的值来动态变更视图元素的显示.
	# groups 可根据当前用户所属安全组,让元素课件. 指定仅该组员成员可看到元素.
	# states 可以根据记录的状态字段来让元素课件.
	# 特别属性 attrs ,值为一个映射invisible属性值与表达式结果的字典.
			例子: 要让closed_date字段在new和open状态时不可见
			<field name="closed_date" attrs="{'invisible':[('state', 'in', ['new', 'open'])]}"/>
            
# 注意:
	invisible不只在字段种可用,任意元素种均可使用.如notebook页面和group元素.attrs属性可以设置两个属性值:readonly和required.

七·列表视图

# tree元素的相关属性
    # default_order让我们可以覆盖模型中的默认排序,它的值和模型中定义的排序格式相同。
    # create, delete和edit,如果设为 false(字母小写),会禁用列表视图中的相应操作。
    # editable让记录在列表视图中可直接被编辑。可用值有 top 和 bottom,表示新记录添加的位置。
	# 数值字段可显示为对应列的汇总值。为字段添加一个累加属性(sum, avg, min或max)会为其分配汇总值的标签文本
<record id="view_tree_checkout" model="ir.ui.view">
    <field name="name">Checkout Tree</field>
    <field name="model">library.checkout</field>
    <field name="arch" type="xml">
        <tree
              decoration-muted="state in ['done', 'cancel']"
              decoration-bf="state=='open'">
            <field name="state" invisible="True" />
            <field name="request_date" />
            <field name="member_id" />
            <field name="checkout_date" />
            <field name="stage_id" />
            <field name="num_books" sum="# Books" />
        </tree>
    </field>
</record>
num_books = fields.Integer(compute='_compute_num_books')

@api.depends('line_ids')
def _compute_num_books(self):
    for book in self:
    	book.num_books = len(book.line_ids)

八·搜索视图

# 
# 这两个过滤器可以分别被启用并以 OR运算符连接。以<separator />元素分隔的整块过滤器以 AND 运算符连接
# 第三个过滤器仅设置 group by 上下文键,它让视图按照字段来对记录分组

#字段属性:
	# name 标识字段
	# string 标签文本,替换默认值
	# operator 修改默认的预算符
	# filter_domain 设置搜索使用的特定域表达式,为operator提供灵活的替代方式. 例如:filter_domain=”[(‘name’, ‘ilike’, self)]”
	# groups 对该字段的搜索仅向安全组内成员开发,值是一个逗号分隔的xmlid列表
# 过滤元素属性
	# name 用作后续继承/扩展或通过窗口操作启用的标识符。这不是必填项,但包含该属性是一个不错的编码习惯。
	# string 是过滤器显示的标签文本,必填
	# domain 是加入当前域的域表达式
	# context 是加入当前上下文的上下文字典。通常使用group_id作为键,用于对记录分组的字段名作为值
	# groups 让该字段的搜索仅对安全组列表(XML IDs)成员开放
<record id="view_filter_checkout" model="ir.ui.view">
    <field name="model">library.checkout</field>
    <field name="arch" type="xml">
        <search>
            <field name="member_id" />
            <field name="user_id" />
            <filter name="filter_not_done"
                    string="To Return"
                    domain="[('state','=','open')]" />
            <filter name="filter_my_checkouts"
                    string="My Checkouts"
                    domain="['user_id', '=', uid]" />
            <filter name="group_user"
                    string="By Member"
                    context="{'group_by': 'member_id'}" />
        </search>
    </field>
</record>

九·其它视图类型

# 其他视图类型:
	activity  # 将计划活动显示为有组织的汇总
	calendar  # 基于所选日期字段以日历格式展示数据
	diagram  # 展示记录间的关系,当前不在 Odoo 中使用

# 两种视图类型用于显示累加数据
	graph  # 用于图表展示
	pivot  # 用于交互的数据透视表
    
# Odoo 企业版中可用
    dashboard   #  使用透视表和图表这类子视图展示累加数据
    cohort   #   用于显示在不同时期数据如何变化
    gantt   #  以甘特图显示日期计划信息,常用于项目管理
    grid   #  通过行和列网格组织数据进行展示
活动视图
#  由mail模块提供. 用于可视化活动任务
<activity string='Activities' />
日历视图
# 在日历种展示记录,按照不同的时间区间.
	# 属性:
		date_start 开始日期 必填
		date_end 结束日期  选填
		date_delay 天数字段,用于替代date_end
		all_day 传入一个布尔字段名,标识全天活动
		color 用于日历添加颜色
		mode 日历视图默认显示模块,
<record id="view_calendar_checkout" model="ir.ui.view">
    <field name="model">library.checkout</field>
    <field name="arch" type="xml">
        <calendar date_start="request_date"
                  color="user_id">
            <field name="member_id" />
            <field name="stage_id" />
        </calendar>
    </field>
</record>

Odoo 12开发之后台视图 – 设计用户界面  ###

透视表视图
# 透视表 是动态分析矩阵  
	# 累加数据仅对数据库种存储的字段有效.
# 比如:
	num_books = fields.Integer(compute='_compute_num_books',store=True)
    
# name像其它视图一样标识图标种的字段
# type是指如何使用字段,行分组(默认)、度量(measure)或列(仅针对透视表,用于列分组)
# interval用于日期字段,是对时间数据的分组间隔:按天、按周、按月、按季度或按年
<record id="view_pivot_checkout" model="ir.ui.view">
    <field name="model">library.checkout</field>
    <field name="arch" type="xml">
        <pivot>
            <field name="stage_id" type="col" />
            <field name="member_id" />
            <field name="request_date" interval="week" />
            <field name="num_books" type="measure" />
        </pivot>
    </field>
</record>

Odoo 12开发之后台视图 – 设计用户界面  ###

图表视图
# 图表视图将数据累加展示图表. 可以使柱状图,线状图和饼图
    # type属性,值可为 bar(默认), pie或line
	# type=”row”是默认值,设置累加值的条件
    # type=”measure”用于作为实际累加值的度量字段
	
<record id="view_graph_checkout" model="ir.ui.view">
    <field name="model">library.checkout</field>
    <field name="arch" type="xml">
        <graph type="bar">
            <field name="stage_id" />
            <field name="num_books" type="measure" />
        </graph>
    </field>
</record>
    

Odoo 12开发之后台视图 – 设计用户界面  ###

上一篇:odoo 分布式,服务器多开,单一数据库


下一篇:Odoo学习——创建模块