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