09. 视图基础
在上一章中已经看到,Odoo 能够为给定的模型生成默认界面视图。但在实际应用中,默认视图对于商业应用程序来说是完全无法接受的。所以,至少应该以一种合乎逻辑的方式来组织各个字段。
视图通过包含操作和菜单的 XML 文件进行定义。它们是 ir.ui.view 模型的实例。
在estate模块中,我们需要以逻辑方式组织字段:
- 在列表视图中,希望显示的内容不仅限于名称。
- 在表单视图中,字段可以分组。
- 在搜索视图中,能够搜索的内容不仅限于名称。例如,可用于筛选“可售”房源的过滤器,以及一个按邮政编码分组的快捷方式。
1、列表视图
一个典型的列表视图,如下所示:

列表视图(也称为列表视图)以表格形式显示记录,其根元素是 <list>。该视图的最基本形式只是列出了要在表格中显示的所有字段(其中每个字段对应一列):
<list string="Tests">
<field name="name"/>
<field name="last_seen"/>
</list>可参考下面一个简单的 [示例] 来实现列表视图。
实践练习:添加自定义列表视图
在相应的 XML 文件中为estate.property 模型定义列表视图。请参阅本节的“目标”部分,了解需要显示的字段。
提示: 请勿添加上文示例中出现的
editable="bottom"属性,后面我们再讨论这一属性。
某些字段标签可能需要进行调整,以符合参考文档的要求。
和往常一样,需要重启服务器(别忘了添加 -u 选项),并刷新浏览器才能看到结果。
注:在本章中,可能会进行一些复制粘贴操作,因此请务必确保每个视图的
id保持唯一,请记住按照安全简介中的说明,为用户设置正确的访问权限。如果用户仅具有读取权限,则不会显示“创建”按钮。
2、表单视图
本节结束时,表单视图应如下所示:

表单用于创建和编辑单条记录。其根元素为 <form>。表单由高级结构元素(groups 和notebooks)以及交互元素(按钮和字段)组成:
<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 提供了一些内置类)来微调外观。一个简单的示例可在此处查看。
实践练习:添加自定义表单视图
在相应的 XML 文件中为 estate.property 模型定义一个表单视图。请参阅本节的“目标”部分,了解该页面的预期最终设计。
在得到预期结果之前,这可能需要一些试错过程;建议一次只添加一个字段和一个标签,以便更好地理解其工作原理。
为了避免每次修改视图后都重新启动服务器,在启动服务器时使用 --dev xml 参数会比较方便:
./odoo-bin --addons-path=addons,dev_addons -d odoodb -u estate --dev xml此参数允许只需刷新页面即可查看视图的修改内容。
参考:有关此主题的文档可在“[表单](View architectures — Odoo 19.0 documentation)”中找到。
3、搜索视图



搜索视图与列表视图和表单视图略有不同,因为它们不显示内容。虽然它们针对特定的模型,但用于过滤其他视图的内容(通常是汇总视图,如列表视图)。除了用例上的差异外,它们的定义方式是相同的。
其根元素是 <search>。该视图的最基本版本仅列出了所有需要快捷方式的字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>Odoo生成的默认搜索视图提供了一个按名称筛选的快捷方式。在自定义搜索视图中添加用户可能用于筛选的字段是非常常见的做法。
添加自定义搜索视图
在相应的 XML 文件中为 estate.property 模型定义一个搜索视图。有关字段列表,请参阅本节“目标”部分的第一张图片。
重启服务器后,应该就可以根据给定的字段进行筛选了。
搜索视图还可以包含 <filter> 元素,这些元素可作为预定义搜索的切换开关。过滤器必须具有以下属性之一:
domain:将给定的域添加到当前搜索中;context:为当前搜索添加一些上下文;使用group_by键根据给定的字段名称对结果进行分组;
这里有一个简单的例子
在继续进行练习之前,有必要先介绍“定义域”的概念。
3.1. 搜索域
在 Odoo 中,域用于编码记录的筛选条件:域是一组用于从模型记录中筛选子集的标准。每个标准由一个字段名、一个运算符和一个值组成的三元组构成。如果指定字段满足运算符对该值应用的条件,则该记录满足该标准。
例如,在“产品”模型中使用以下域时,将筛选出所有单价大于 1000 的服务:
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]XML 不允许在 XML 元素内部使用 < 和 &。为避免解析错误,应使用实体引用:用 < 代替 <,用 &代替 &。其他实体引用(>、' 和 ")为可选。
<filter name="negative" domain="[('test_val', '<', 0)]"/>添加筛选条件和分组功能
应在之前创建的搜索视图中添加以下内容:
一个筛选条件,用于显示可售房源,即房源状态应为“新房”或“已收到报价”。
按邮政编码对结果进行分组的功能。
看起来不错?到目前为止,我们已经能够创建模型并设计出符合业务逻辑的用户界面。然而,还有一个关键组件尚未到位:模型之间的关联。
参考:有关此主题的文档可在“搜索域”中找到。