第 6 章:基础视图¶
我们在 上一章 中已经看到,Odoo 能够为给定模型生成默认视图。但在实践中,默认视图对于业务应用来说 永远 不可接受。相反,我们至少应以合乎逻辑的方式组织各个字段。
视图与动作和菜单一样,都在 XML 文件中定义。它们是 ir.ui.view 模型的实例。
在我们的房地产模块中,我们需要以合乎逻辑的方式组织字段:
在列表视图中,我们希望显示的不只是名称。
在表单视图中,字段应进行分组。
在搜索视图中,我们必须能够不仅仅按名称进行搜索。具体来说,我们希望有一个筛选 ‘Available’ 房产的过滤器,以及一个按邮编分组的快捷方式。
列表¶
参考:本主题相关文档请参阅 列表。
注解
目标:本节结束时,列表视图应如下所示:
列表视图以表格形式显示记录。
其根元素为 <list>。该视图最基本的版本只是列出要在表格中显示的所有字段(每个字段为一列):
<list string="Tests">
<field name="name"/>
<field name="last_seen"/>
</list>
这里 有一个简单的示例。
练习
添加自定义列表视图。
在合适的 XML 文件中为 estate.property 模型定义一个列表视图。要显示的字段请参阅本节的 目标。
提示:
不要添加上面示例中出现的
editable="bottom"属性。我们稍后会再讨论它。某些字段标签可能需要调整,以与参考图一致。
一如既往,你需要重启服务器(别忘了 -u 选项)并刷新浏览器才能看到结果。
警告
本章中你可能会用到复制粘贴,因此务必确保每个视图的 id 保持唯一!
窗体¶
参考:本主题相关文档请参阅 窗体。
注解
目标:本节结束时,表单视图应如下所示:
表单用于创建和编辑单条记录。
其根元素为 <form>。它们由高层结构元素(分组和 notebook)以及交互元素(按钮和字段)组成:
<form string="Test">
<sheet>
<group>
<group>
<field name="name"/>
</group>
<group>
<field name="last_seen"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</sheet>
</form>
也可以使用 div、h1 等常规 HTML 标签以及 class 属性(Odoo 提供了一些内置类)来微调外观。
这里 有一个简单的示例。
练习
添加自定义表单视图。
在合适的 XML 文件中为 estate.property 模型定义一个表单视图。页面预期的最终设计请参阅本节的 目标。
在达到预期结果之前,你可能需要反复尝试 ;-) 建议你一次只添加一个字段和一个标签,以便理解其工作原理。
为了避免每次修改视图后都重新启动服务器,在启动服务器时使用 --dev xml 参数会很方便:
$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate --dev xml
该参数让你只需刷新页面即可查看对视图的修改。
搜索¶
参考:本主题相关文档请参阅 搜索。
注解
目标:本节结束时,搜索视图应如下所示:
搜索视图与列表视图和表单视图略有不同,因为它们不显示 内容。虽然它们应用于特定模型,但用于筛选其他视图的内容(通常是 列表 等聚合视图)。除了用途不同之外,它们的定义方式相同。
其根元素为 <search>。该视图最基本的版本只是列出所有希望提供快捷方式的字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>
Odoo 生成的默认搜索视图提供了按 name 筛选的快捷方式。在自定义搜索视图中,通常会添加用户可能用于筛选的字段。
练习
添加自定义搜索视图。
在合适的 XML 文件中为 estate.property 模型定义一个搜索视图。字段列表请参阅本节 目标 中的第一张图片。
重启服务器后,应该可以按给定的字段进行筛选。
搜索视图还可以包含 <filter> 元素,它们充当预定义搜索的开关。过滤器必须具有以下属性之一:
domain:将给定的域添加到当前搜索中context:为当前搜索添加一些上下文;使用group_by键按给定字段名对结果进行分组
一个简单的示例可在 这里 找到。
在进一步完成练习之前,有必要先介绍“域”(domain)的概念。
域¶
参考:与本主题相关的文档可在 搜索域 中找到。
在 Odoo 中,域用于编码记录上的条件:域是一个条件列表,用于选取模型中记录的子集。每个条件都是一个三元组,包含 字段名、运算符 和 值。如果指定字段满足运算符作用于该值所设定的条件,则该记录满足此条件。
例如,在 产品 模型上使用时,以下域会选取所有单价大于 1000 的 服务:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件之间以隐式 AND 组合,也就是说记录必须满足 每一个 条件才能匹配某个域。可以使用逻辑运算符 & (AND)、| (OR)和 ! (NOT)来显式组合条件。它们采用前缀位置(运算符插入在其参数之前,而不是参数之间)。例如,要选取“属于服务 OR 单价 不在 1000 与 2000 之间”的产品:
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
注解
XML 不允许在 XML 元素内使用 < 和 &。为避免解析错误,应使用实体引用:< 用 <,& 用 &。其他实体引用(>、' 和 ")是可选的。
示例
<filter name="negative" domain="[('test_val', '<', 0)]"/>
练习
添加过滤器和分组依据。
应将以下内容添加到之前创建的搜索视图中:
一个用于显示可用房产的过滤器,即状态应为“New”(新建)或“Offer Received”(已收到报价)。
能够按邮编对结果进行分组。
还不错吧?至此我们已经能够创建模型并设计出符合业务需求的用户界面。然而,还缺少一个关键部分:模型之间的关联。