第6章:基础视图¶
我们在 上一章 中已经看到,Odoo 能够为给定模型生成默认视图。实际上,默认视图对于业务应用来说 永远 不可接受。相反,我们至少应该以逻辑方式组织各个字段。
视图在 XML 文件中定义,包含操作和菜单。它们是 ir.ui.view
模型的实例。
在我们的房地产模块中,我们需要以逻辑方式组织字段:
在列表视图中,我们希望显示的不仅仅是名称。
在表单视图中,字段应该被分组。
在搜索视图中,我们必须能够搜索更多的内容,而不仅仅是名称。具体来说,我们想要一个“可用”属性的过滤器和一个按邮政编码分组的快捷方式。
列表¶
参考:与此主题相关的文档可在 列表 中找到。
注解
目标:在本节结束时,列表视图应如下所示:
列表视图,也称为列表视图,以表格形式显示记录。
它们的根元素是 <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
: adds the given domain to the current searchcontext
:为当前搜索添加一些上下文;使用键group_by
按给定字段名对结果进行分组
一个简单的例子可以在 这里 找到。
在继续进行本练习之前,有必要介绍“域”概念。
域名¶
参考: 有关此主题的文档可以在 搜索域 中找到。
在Odoo中,域编码记录的条件:域是模型记录的子集选择的条件列表。每个条件是一个三元组,包括 字段名 , 操作符 和 值 。如果指定的字段满足操作符应用于值的条件,则记录满足条件。
例如,当应用于 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 不允许在 XML 元素内部使用 <
和 &
。为避免解析错误,应使用实体引用:<
代替 <
,&
代替 &
。其他实体引用(>
、'
和 "
)是可选的。
Example
<filter name="negative" domain="[('test_val', '<', 0)]"/>
Exercise
添加筛选和分组。
应该添加以下内容到之前创建的搜索视图中:
一个过滤器,显示可用的属性,即状态应为“新”或“已收到报价”。
按邮政编码分组结果的能力。
看起来不错吧?目前我们已经能够创建模型并设计出符合业务逻辑的用户界面。然而,仍缺少一个关键组件:模型之间的链接。