转载:http://book.odoomommy.com/chapter2/README7.html
第四章 视图
我们在第一部分中简单地介绍过常见的几种视图及其用法, 但鉴于当时的学习水平, 我们并没有过多的介绍其内部的工作原理。本章, 我们将深入视图的世界, 了解它的本质和加深对它的认知。
视图对象模型
Odoo中的视图在对象模型中与之对应的是ir.ui.view, 我们查看其源代码时,可以看到原生的视图有如下的几种:
type = fields.Selection([('tree', 'Tree'),
('form', 'Form'),
('graph', 'Graph'),
('pivot', 'Pivot'),
('calendar', 'Calendar'),
('gantt', 'Gantt'),
('kanban', 'Kanban'),
('search', 'Search'),
('qweb', 'QWeb')], string='View Type')
我们也可以自定义自己的视图模型, 添加我们自己的视图类型。但添加视图, 涉及到Qweb的知识, 等我们学习完Qweb技术以后再来介绍如何自定义一个自己的视图类型。现在, 我们先来重新认识一下已知的几种视图。
按钮
按钮的两种类型,object和action。
默认视图
当你定义了一个模型,如果你没有写任何关于这个模型的视图,那么Odoo将会为你自动生成默认的视图。
_get_default_form_view 方法用于生成默认form视图 _get_default_search_view 方法用于生成默认的搜索视图 _get_default_tree_view 方法用于生成默认的列表视图 _get_default_pivot_view 方法用于生成默认的透视图 _get_default_kanban_view 方法用于生成默认的看板视图 _get_default_graph_view 方法用于生成默认的graph视图 _get_default_calendar_view 方法用于生成默认的日历视图
Datetime类型转Date
在视图中可以使DateTime类型的部件表现得像Date一样,只需要在xml中指定部件
<field name="date" widget="date"/>
搜索视图
在odoo中像过滤、分组等功能是通过搜索视图来完成的。按照搜索条件的不同,可以分为三种类型的搜索:字段匹配、条件过滤和字段分组。
字段匹配
字段匹配的效果,就是在搜索框内输入关键字,出现下拉列表显示可以匹配的字段,特点是快速完成条件过滤。字段匹配的样板代码如下:
<search string="Tasks">
<field name="tag_ids"/>
<field name="partner_id"/>
<field name="project_id"/>
<field name="user_id"/>
<field name="stage_id"/>
</seach>
条件过滤
条件过滤是字段匹配的扩展版,预先存储了过滤条件的组合,可以在搜索框下的筛选按钮中显示,快速过滤。条件过滤的样板代码如下:
<filter string="My Tasks" name="my_tasks" domain="[('user_id','=',uid)]"/>
<filter string="My Followed Tasks" name="my_followed_tasks" domain="[('message_is_follower', '=', True)]"/>
<filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/>
字段分组
分组同条件过滤类似,就是将预先设置好的分组,显示在搜索框的分组按钮中,分组的样板代码如下:
<group expand="0" string="Group By">
<filter string="Project" name="project" context="{'group_by':'project_id'}"/>
<filter string="Task" name="task" context="{'group_by':'name'}"/>
<filter string="Assigned to" name="user" context="{'group_by':'user_id'}"/>
<filter string="Stage" name="stage" context="{'group_by':'stage_id'}"/>
<filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
</group>
与条件过滤不同的是,条件过滤使用的domain,而分组是在context通过group_by+关键字的形式完成的。
分组的排序
分组不支持排序定义,并且定义在模型上的排序规则在分组的时候并未生效。退而求其次的实现方法是在tree视图中增加default_order属性来实现指定分组时的默认排序规则。
<tree default_order="date_order desc">
...
</tree>
动作中添加默认分组/过滤条件
我们也经常看到,点击某个菜单的时候,会带着默认的分组和过滤条件,这个是怎么完成的呢?
答案在动作的context字段中,上一章中,我们提到了给某个字段设置默认值的操作,本章中的设置默认条件也是类似,只要在我们的过滤条件name前加上searchdefault前缀就可以了。
<record id="project.action_view_task" model="ir.actions.act_window">
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field name="context">{'search_default_my_tasks': 1,'search_default_parent_task':1,'group_by':['group_id','project_id']}</field>
</record>
如果需要多个字段分组,使用列表将字段括起来即可,字段的先后顺序就是分组的先后顺序。
搜索明细中的字段
有一种场景,我们主要在主单的列表视图中搜索明细表中的某个字段。典型的例子就是我们在销售订单的视图中想要搜索包含某个产品的订单,因为产品是明细表中的字段,销售订单表中并没有提供产品这个字段供我们搜索,我们看odoo官方是如何解决这个问题的:
<field name="order_line" string="Product" filter_domain="[('order_line.product_id', 'ilike', self)]"/>
即,使用order_line.字段名 的方式引入需要的字段,然后传入self来完成。
Form视图
给页面添加chatter
_inherit = ['mail.thread', 'mail.activity.mixin']
<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>
快速编辑的取消
对于Manyone类型的字段,默认的渲染模式是会有一个下拉列表,附带这快速创建与编辑的功能,通常情况下,这是非常有用的。但是,特定情况下,我们也希望用户不能快速编辑和创建,希望Many2one的特性像Selection一样,只能让用户选择。
这种情况下,我们可以在xml中使用options来控制
<field name="xxx" options="{'no_create_edit': True, 'no_create':True, 'no_open':True">
Graph视图
Graph视图是包含一系列图表类型的可视化视图,常见的支持类型有柱状图、折线图、饼状图等等,可以将数据以更直观的方式显示出来。
Kanban视图
kanban视图的中的格式化
我们在使用看板布局的时候,有时候希望能在字段前加入空格,因为kanban被渲染时使用html语法 ,因此我们手动在视图中添加的空格并不能被解析成空格,因此我们需要使用特殊的语法。
在xml中通常使用
来替代空格,但是在odoo中lxml进行解析时,又会提示:
lxml.etree.XMLSyntaxError: Entity 'nbsp' not defined
说明在lxml库中并没有实体entity与空格进行对应,这时我们就要使用空格的十进制编码 
进行替代了。