第 6 章:基础视图(Basic Views)¶
在 上一章 中,我们已经看到 Odoo 能够为给定模型生成默认视图。然而,在实际应用中,默认视图对于业务应用程序来说 永远 是不可接受的。相反,我们应该至少以逻辑的方式组织各个字段。
视图(Views)是在 XML 文件中通过操作(actions)和菜单(menus)定义的。它们是 ir.ui.view
模型的实例。
在我们的房地产模块中,我们需要以逻辑的方式组织字段:
在列表视图(list view)中,我们希望显示的不仅仅是名称。
在表单视图(form view)中,字段应分组显示。
在搜索视图(search view)中,我们必须能够搜索的不仅仅是名称。具体来说,我们需要一个针对“可用”属性的过滤器,以及按邮政编码分组的快捷方式。
列表¶
参考:与此主题相关的文档可以在 列表 中找到。
注解
目标:在本节结束时,列表视图应如下所示:

列表视图(List Views),也称为表格视图,以表格形式显示记录。
它们的根元素是 <list>
。此视图的最基本版本只是列出表中要显示的所有字段(每个字段是一列):
<list string="Tests">
<field name="name"/>
<field name="last_seen"/>
</list>
一个简单的示例可以在这里找到:示例链接 。
Exercise
添加自定义列表视图。
在适当的 XML 文件中为 estate.property
模型定义一个列表视图。查看本节的 目标 以了解需要显示的字段。
提示:
不要添加您在上面示例中看到的
editable="bottom"
属性。我们稍后会再讨论它。某些字段标签可能需要调整以匹配参考内容。
像往常一样,您需要重启服务器(别忘了使用 -u
选项)并刷新浏览器以查看结果。
警告
在本章中,您可能会使用一些复制粘贴操作,因此请务必确保每个视图的 id
唯一!
表单¶
参考:与此主题相关的文档可以在 表单 中找到。
注解
目标:在本节结束时,表单视图应如下所示:

表单用于创建和编辑单条记录。
它们的根元素是 <form>
。表单由高级结构元素(如组和笔记本)以及交互式元素(如按钮和字段)组成:
<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
此参数允许您仅通过刷新页面即可查看视图修改。
搜索¶
参考:与此主题相关的文档可以在 搜索 中找到。
注解
目标:在本节结束时,搜索视图应如下所示:



搜索视图与列表视图和表单视图略有不同,因为它们不显示 内容。尽管它们适用于特定模型,但它们用于过滤其他视图的内容(通常是聚合视图,例如 列表 )。除了用例上的差异外,它们的定义方式是相同的。
它们的根元素是 <search>
。此视图的最基本版本只是列出所有需要快捷方式的字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>
Odoo 生成的默认搜索视图为 name
提供了一个过滤快捷方式。在自定义搜索视图中,通常会添加用户可能过滤的字段。
Exercise
添加自定义搜索视图。
在适当的 XML 文件中为 estate.property
模型定义搜索视图。查看本节 目标 的第一张图片以获取字段列表。
重启服务器后,应该可以对指定字段进行过滤。
搜索视图还可以包含 <filter>
元素,这些元素充当预定义搜索的开关。过滤器必须具有以下属性之一:
domain
:将给定的域(domain)添加到当前搜索中context
:为当前搜索添加上下文;使用键group_by
按给定字段名称对结果进行分组
一个简单的示例可以在这里找到: 示例链接 。
在继续练习之前,有必要介绍“域(domain)”的概念。
域¶
参考:与此主题相关的文档可以在 搜索域 中找到。
在 Odoo 中,域(domain)编码了记录的条件:域是一个条件列表,用于选择模型记录的子集。每个条件是一个三元组,包含 字段名称、运算符 和 值。如果指定字段满足应用于值的运算符条件,则记录符合该条件。
例如,当应用于 产品(Product) 模型时,以下域选择所有单价大于 1000 的 服务(services)::
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件通过隐式的 AND 组合,这意味着记录要匹配域,必须满足 每个 条件。逻辑运算符 &
(AND)、|
(OR)和 !
(NOT)可以用于显式组合条件。它们以前缀位置使用(运算符插入在其参数之前,而不是之间)。例如,选择“是服务 或 单价 不在 1000 到 2000 之间的产品”::
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
注解
XML does not allow <
and &
to be used inside XML
elements. To avoid parsing errors, entity references should be used:
<
for <
and &
for &
. Other entity references
(>
, '
& "
) are optional.
Example
<filter name="negative" domain="[('test_val', '<', 0)]"/>
Exercise
添加过滤器和分组功能。
以下内容应添加到之前创建的搜索视图中:
一个显示可用属性的过滤器,即状态应为“新建”或“已收到报价”。
按邮政编码对结果进行分组的功能。
看起来不错?此时,我们已经能够创建模型并设计出业务上有意义的用户界面。然而,一个关键组件仍然缺失:模型之间的 链接 。