第七章 基本视图
在之前的章节中我们已经看到Odoo能够给模型生成默认的视图。 实际上,默认视图几乎从来不会用到,相反的,我们应该按照一定的逻辑来组织各个字段。
视图跟动作和菜单一样在XML文件中定义,他们是ir.ui.view模型的实例。
在我们的房地产模块中,我们需要按照一定逻辑来组织字段:
- 在list视图中,我们不止显示name字段
- 在form视图中,字段应该被分组
- 在搜索视图中,我们不止能搜索name字段,另外,我们需要一个“available”的过滤器,并且能按照postcode来分组。
List
参考:关于这个主题的文档在这里 List.
目标: 这一小节最后,list视图应该如下显示
列表视图也叫树形视图,以表格形式显示记录。
根元素是tree,最基本的tree视图只是简单的显示字段,一个字段对应数据库表中的一列。
<tree string="Tests">
<field name="name"/>
<field name="last_seen"/>
</tree>
练习: 增加一个列表视图
在合适的XML文件中给estate.property 模型增加一个list视图,检查我们的目标字段是否被显示。
Tips:
- 不要增加editable="bottom"属性,后面我们会讨论它。
- 一些字段的标签可能需要调整(通过string属性)
一如既往,我们需要重启服务,别忘了 -u 选项,并且刷新浏览器就能看到结果了。
警告:
你可能需要一些复制粘贴的操作,因此要确认 id字段要保持唯一。
Form
参考:关于这个主题的文档在这里 Form.
目标: 这一小节最后,form视图应该这样:
Forms视图用来新增或修改单条记录。
根元素是form, 他们由高级别的结构元素groups和notebooks以及交互元素 buttons和fields组成。
<form string="Test">
<sheet>
<group>
<group>
<field name="name"/>
</group>
<group>
<field name="last_seen"/>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</group>
</sheet>
</form>
在form视图中可以使用html标签,比如div和h1,以及class属性(Odoo提供了一些内置的class)来微调视图的外观。
注意: 这点很重要,form视图可以高度定制化
这里有一个简单的例子here.
练习: 增加自定义的form视图。
在合适的xml文件中给estate.property 模型增加form视图,检查是否完成了这一小节的目标。
这可能需要一些尝试和错误才能得到期望的结果,建议你每次只增加一个字段或者一个标签,这样能更好的帮助你理解它怎么工作
为了避免修改视图后每次都要重启服务,使用选项 --dev xml会比较方便, 使用这个参数启动服务后,当你修改了视图,只要刷新浏览器就能看到效果。
$ ./odoo-bin --addons-path=addons,../enterprise/,../technical-training-sandbox/ -d rd-demo -u estate --dev xml
搜索(Search)
参考:关于这个主题的文档在这里Search.
目标: 这一小节最后,search视图应该这样:
搜索视图跟form和list视图稍微有些不同,因为它不显示任何内容。虽然他们应用到了特定的模型,不过他们用来过滤其他视图的数据(一般是list视图),除了用法的不同,他们以相同的方式定义。
根元素是search,最基本的版本简单的列出被搜索的字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>
Odoo提供的默认的搜索视图只有一个叫“name”的过滤器,用户可以在自定义的search视图中增加其他的过滤器。
练习: 增加一个自定义的搜索视图
在合适的XML文件中为estate.property
模型增加一个自定义的搜索视图 ,并且要实现本小节的目标。
重启服务后,就可以根据给定的字段来过滤数据了。
搜索视图可以包括filter元素,它包含预定义的搜索,filter必须包含下面的属性中的一个:
domain
: 将给定域添加到当前搜索(指定where搜索条件)context
: 给当前搜索增加一下上下问,用group_by分组搜索结果
这里有一个简单的例子here.
在进一步的练习之前,有必要介绍一下domain的概念。
域(Domains)
参考:关于这个主题的文档在这里 Search domains.
在Odoo中,域就是一组搜索条件,类似where语句 。 域是用于选择模型记录子集的标准列表。每个条件都是一个三元组,包含“字段名”、“操作符”和“值”。如果指定的字段满足应用于该值的运算符的条件,则记录满足标准。
默认的逻辑运算是and
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
逻辑运算符放在前面,默认是& (and),其他还有 | (or), !(not)
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
练习:增加过滤器和分组
将下面内容增加到前面的搜索视图中:
- 一个过滤器显示有效的房产,也就是说state是“新订单”或者“收到订单”
- 根据postcode来分组结果
看上去还好码? 在这一刻我们已经能够创建模型并且设计UI,不过,一个关键的组件还没有说,模型之间的连接 link between models.