我们在前一章中已经看到,Odoo能够为给定模型生成默认视图。实际上,对于业务应用程序来说,默认视图是永远不能满足的。相反,我们至少应该有逻辑的组织各个领域。
视图在带有动作和菜单的XML文件中定义。它们是ir.ui.view
模型的实例。
在房地产模块中,我们需要有逻辑的组织字段:
- 在列表(树)视图中,我们希望显示的不仅仅是名称。
- 在表单视图中,应将字段分组。
- 在搜索视图中,我们必须能够搜索的不仅仅是名称。具体来说,我们需要“可用”属性的过滤器和按邮政编码分组的快捷方式。
列表
参考:与本主题相关的文档可在列表中找到。
备注
目标:在本节末尾,列表视图应该如下所示:
列表视图也称为树状视图,以表格形式显示记录。
它们的根元素是<tree>
。该视图最基本的版本只是列出了表中要显示的所有字段(其中每个字段都是一列):
<tree string="Tests">
<field name="name"/>
<field name="last_seen"/>
</tree>
这里有一个简单的例子(L46-L54行)。
练习
添加自定义列表视图。
在适当的XML文件中定义estation.property
模型的列表视图。检查本节的目标以显示要显示的字段。
提示:
- 请勿在上面的示例中添加
editable="bottom"
属性。我们稍后再回来。- 可能需要对某些字段标签进行调整以匹配参考。
与往常一样,您需要重新启动服务器(不要忘记-u
选项),然后刷新浏览器以查看结果。
警告
您可能会在本章中使用一些副本,因此请始终确保每个视图的id
保持唯一!
表单
参考:与本主题相关的文档可以在表单中找到。
备注
目标:在本节末尾,表单视图应如下所示:
表单用于创建和编辑单个记录。
它们的根元素是<form>
。它们由高级结构元素(组和笔记本)和交互元素(按钮和字段)组成:
<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>
可以使用常规HTML标记(如div和h1)以及class属性(Odoo提供了一些内置类)来微调外观。
这里有一个简单的例子(L16-L44行)。
练习
添加自定义表单视图。
在适当的XML文件中定义estation.property
模型的表单视图。检查本节的目标,以了解页面的预期最终设计。
在获得预期的结果之前,这可能需要一些反复试验;建议您一次添加字段和标签,以帮助了解其工作原理。
为了避免每次修改视图时重新启动服务器,在启动服务器时使用--dev xml
参数可能很方便:
$ ./odoo-bin --addons-path=../custom,../enterprise/,addons -d rd-demo -u estate --dev xml
此参数允许您仅刷新页面以查看视图修改。
搜索框
参考:可以在搜索中找到与此主题相关的文档。
备注
目标:在本节末尾,搜索视图应如下所示:
搜索视图与列表视图和表单视图略有不同,因为它们不显示内容。虽然它们适用于特定模型,但它们用于过滤其他视图的内容(通常是聚合视图,如列表)。除了用例的不同之外,它们的定义方式是相同的。
它们的根元素是<search>
。此视图的最基本版本只是列出了需要快捷方式的所有字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>
由Odoo生成的默认搜索视图提供了按name
筛选的快捷方式。在自定义搜索视图中添加用户可能筛选的字段是很常见的。
练习
添加自定义搜索视图。
在适当的XML文件中定义estair.property
模型的搜索视图。检查本节目标的第一个图像以获取字段列表。
重新启动服务器后,应该可以对给定字段进行筛选。
搜索视图还可以包含<filter>
元素,这些元素充当预定义搜索的开关。过滤器必须具有以下属性之一:
- domain:将给定域添加到当前搜索
- context:为当前搜索添加一些上下文;使用键group_by对给定字段名的结果进行分组
这里有一个简单的例子(L30-L44行)。
在进一步练习之前,有必要介绍domain
概念。
Domains
参考:与本主题相关的文档可以在搜索域中找到。
在Odoo中,域对记录的条件进行编码:域是用于选择模型记录子集的条件列表。每个条件是一个三元组,包含字段名、运算符和值。如果指定字段满足应用于该值的运算符的条件,则记录满足条件。
例如,当在产品模型上使用时,以下域选择了所有单位价格大于1000的服务:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件与隐式AND组合,这意味着需要满足每个条件才能使记录与域匹配。逻辑运算符&(AND),|(OR)和!(NOT)可用于显式组合条件。它们用于前缀位置(运算符插入在其参数之前,而不是在参数之间)。例如,要选择“属于服务或单价不在1000和2000之间”的产品:
[
'|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)
]
练习
添加过滤器和组。
应将以下内容添加到先前创建的搜索视图中:
- 显示可用属性的筛选器,即状态应为“New”或“Offer Received”。
- 按邮政编码对结果进行分组的能力。
看起来不错?在这一点上,我们已经能够创建模型和设计一个用户界面,这对业务是有意义的。然而,仍然缺少一个关键组件:模型之间的链接。