原文:Odoo 18 官方开发教程“Server framework 101”第 6 章。本文尽量保留原文结构、代码、练习与图片,仅进行中文翻译,并在文末增加“老赵解读”。
第6章:基本观点
我们在 上一章 中看到 Odoo 能够
为给定的模型生成默认视图。实际上,默认视图是 从不 可以接受
用于商业应用程序。相反,我们至少应该以逻辑的方式组织各种字段
方式。
视图在带有操作和菜单的 XML 文件中定义。他们是
ir.ui.view模型。
在我们的房地产模块中,我们需要以逻辑方式组织字段:
- 在列表视图中,我们想要显示的不仅仅是名称。
- 在表单视图中,应将字段分组。
- 在搜索视图中,我们必须能够搜索的不仅仅是名称。具体来说,我们想要一个
过滤“可用”房产和按邮政编码分组的快捷方式。
列表
参考:与该主题相关的文档可以在以下位置找到
列表。
说明
目标:在本节末尾,列表视图应如下所示:
列表视图,也称为列表视图,以表格形式显示记录。
它们的根元素是 <list>。这个视图最基本的版本很简单
列出要在表中显示的所有字段(其中每个字段是一列):
<list string="Tests">
<field name="name"/>
<field name="last_seen"/>
</list>
可以找到一个简单的例子
这里。
练习
添加自定义列表视图。
在相应的 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 提供了一些内置类)来微调外观。
可以找到一个简单的例子
这里。
练习
添加自定义表单视图。
在相应的 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 进行过滤的快捷方式。这是非常
常见的做法是添加用户可能在自定义搜索视图中进行过滤的字段。
练习
添加自定义搜索视图。
在相应的 XML 文件中定义
estate.property模型的搜索视图。检查
本节的第一张图片 目标 查看字段的列表。
重新启动服务器后,应该可以过滤给定的字段。
搜索视图还可以包含 <filter> 元素,用作切换
预定义的搜索。过滤器必须具有以下属性之一:
domain:将给定的域添加到当前搜索中context:向当前搜索添加一些上下文;使用密钥group_by进行分组
给定字段名称的结果
可以找到一个简单的例子
这里。
在进一步练习之前,有必要介绍一下“域”的概念。
域
参考:与该主题相关的文档可以在以下位置找到
搜索域。
在 Odoo 中,域对以下条件进行编码
记录:域是用于选择模型的子集的标准列表
记录。每个标准都是一个三元组,其中 字段名称, 一个 操作员 和一个 值。
如果指定的字段满足应用于该值的运算符的条件,则记录满足标准。
例如,当用于 产品展示 模型以下域选择
全部 服务 单价大于 1000:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件与隐式 AND 组合,意思是 每个 标准
需要满足记录才能匹配域。逻辑运算符
& (AND)、| (OR) 和 ! (NOT) 可用于显式组合
标准。它们用在前缀位置(运算符插在前面
它的参数而不是之间)。例如,选择“哪些产品”
服务 或 有一个单价是 不 1000 到 2000 之间:
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
说明
XML 不允许在 XML 内部使用
<和&
元素。为了避免解析错误,应使用实体引用:
<对应<,&对应&。其他实体参考
(>、'和") 是可选的。示例
xml <filter name="negative" domain="[('test_val', '<', 0)]"/>
练习
添加过滤器和分组依据。
应将以下内容添加到先前创建的搜索视图中:
- 显示可用房产的过滤器,即状态应为“New”或
“报价已收到”。- 按邮政编码对结果进行分组的能力。
看起来不错吗?此时我们已经能够创建模型并设计一个用户界面
从商业角度来说是有道理的。然而,仍然缺少一个关键组件:
模型之间的链接。
老赵解读
列表、表单和搜索视图分别解决批量浏览、单据处理和数据定位问题。它们不是三张孤立页面,而是同一业务对象的三个使用视角。
视图设计应优先服务高频任务:列表保留最有辨识度的字段,表单按业务阶段分组,搜索视图提供真正有管理价值的筛选和分组。字段越多并不代表信息越完整,反而可能增加操作成本。