原文:Odoo 18 官方开发教程“Server framework 101”第 5 章。本文尽量保留原文结构、代码、练习与图片,仅进行中文翻译,并在文末增加“老赵解读”。
第 5 章:最后,一些可以使用的 UI
现在我们已经创建了新的 模型 及其
对应访问权,是时候
与用户界面交互。
在本章末尾,我们将创建几个菜单来访问默认列表
和表单视图。
数据文件 (XML)
参考:与该主题相关的文档可以在以下位置找到
数据文件。
在第 4 章:安全性 - 简介中,我们通过CSV文件添加数据。 CSV
当要加载的数据具有简单格式时,格式很方便。当格式比较复杂时
(例如加载视图或电子邮件模板的结构),我们使用 XML 格式。例如,
这个
帮助字段
包含 HTML 标签。虽然可以通过 CSV 文件加载此类数据,但它更
方便使用 XML 文件。
XML 文件必须添加到与 CSV 文件相同的文件夹中,并在
__manifest__.py。当模块安装或安装时,数据文件的内容也会按顺序加载
已更新,因此针对 CSV 文件所做的所有说明也适用于 XML 文件。
当数据链接到视图时,我们将它们添加到 views 文件夹中。
在本章中,我们将通过 XML 文件加载第一个操作和菜单。操作和菜单是
数据库中的标准记录。
说明
当性能很重要时,CSV 格式优于 XML 格式。 Odoo 就是这种情况
其中加载 CSV 文件比加载 XML 文件更快。
在 Odoo 中,用户界面(操作、菜单和视图)主要是通过创建
并编写在 XML 文件中定义的记录。常见的模式是“菜单”>“操作”>“视图”。
要访问记录,用户需要浏览多个菜单级别;最深的层次是
触发打开记录列表的操作。
行动
参考:与该主题相关的文档可以在以下位置找到
行动。
说明
目标:在本节末尾,应在系统中加载一个操作。我们不会看到
UI 中还没有任何内容,但文件应该加载到日志中:
text INFO rd-demo odoo.modules.loading: loading estate/views/estate_property_views.xml
可以通过三种方式触发操作:
- 通过单击菜单项(链接到特定操作)
- 通过单击视图中的按钮(如果这些按钮连接到操作)
- 作为对象上的上下文操作
本章我们只介绍第一种情况。第二种情况将包含在
后面的章节 而最后一个是焦点
高级主题。在我们的房地产示例中,我们希望将菜单链接到 estate.property
模型,因此我们能够创建一个新的记录。该操作可以被视为菜单之间的链接
和模型。
我们的 test_model 的基本操作是:
<record id="test_model_action" model="ir.actions.act_window">
<field name="name">Test action</field>
<field name="res_model">test_model</field>
<field name="view_mode">list,form</field>
</record>
id是 外部标识符。可以用来参考记录
(不知道其数据库内标识符)。model的固定值为ir.actions.act_window(窗口操作 (ir.actions.act_window))。name是操作的名称。res_model是操作适用的模型。view_mode是将可用的视图;在本例中,它们是列表视图和表单视图。
我们会看到 后来 还可以有其他视图模式。
Odoo 中随处可见示例,但是
这个
是一个简单动作的好例子。请注意 XML 数据文件的结构,因为您将
在接下来的练习中需要它。
练习
添加一个动作。
在适当的文件夹中创建
estate_property_views.xml文件并在
__manifest__.py文件。为模型
estate.property创建操作。
重新启动服务器,您应该会在日志中看到加载的文件。
菜单
参考:与该主题相关的文档可以在以下位置找到
快捷方式。
说明
目标:在本节末尾,应创建三个菜单,默认视图是
显示:
为了降低声明菜单 (ir.ui.menu) 并将其连接到相应操作的复杂性,
我们可以使用 <menuitem> 快捷方式。
我们的 test_model_action 的基本菜单是:
<menuitem id="test_model_menu_action" action="test_model_action"/>
菜单 test_model_menu_action 链接到操作 test_model_action,并且该操作
链接到模型 test_model。如前所述,该操作可以看作是链接
菜单和模型之间。
然而,菜单总是遵循一个架构,并且在实践中存在三个级别的菜单:
- 根菜单,显示在应用程序切换器中(Odoo 社区应用程序切换器是
下拉菜单) - 一级菜单,显示在顶栏
- 操作菜单
定义结构的最简单方法是在 XML 文件中创建它。一个基本的
我们的 test_model_action 的结构是:
<menuitem id="test_menu_root" name="Test">
<menuitem id="test_first_level_menu" name="First Level">
<menuitem id="test_model_menu_action" action="test_model_action"/>
</menuitem>
</menuitem>
第三个菜单的名称取自 action 的名称。
练习
添加菜单。
在适当的文件夹中创建
estate_menus.xml文件并在
__manifest__.py文件。请记住数据文件的顺序加载;-)为前面创建的
estate.property操作创建三级菜单
练习。请参阅 目标 本节的预期结果。
重新启动服务器并 刷新浏览器1。您现在应该看到菜单,
您甚至可以制作您的第一个房地产房产广告!
字段,属性和视图
说明
目标:在本节末尾,销售价格应为只读,数量
卧室数量和可用日期应具有默认值。另外还有售价
当记录重复时,不会复制可用日期值。
保留的字段
active和state将添加到estate.property模型中。
到目前为止,我们只使用了房地产房产广告的通用视图,但是
在大多数情况下,我们想要微调视图。 Odoo 中有很多可以进行微调的地方,但是
通常第一步是确保:
- 一些字段有默认值
- 一些字段是只读的
- 复制记录时,某些字段未被复制
在我们的房地产业务案例中,我们希望:
- 售价应该是只读的(稍后会自动填写)
- 复制记录时不应复制供货日期和售价
- 默认卧室数量应为 2
- 默认可用日期应为 3 个月内
一些新属性
在进一步进行视图设计之前,让我们回到我们的模型定义。我们看到一些
属性(例如 required=True)会影响数据库中的表架构。其他属性
将影响视图或提供默认值。
练习
将新属性添加到字段。
找到适当的属性(请参阅
Field)以:
- 将售价设置为只读
- 防止复制可用日期和售价值
重新启动服务器并刷新浏览器。您不应该能够设置任何售价。当
复制记录,可用日期应为空。
默认值
任何字段都可以被赋予默认值。在字段定义中,添加选项
default=X 其中 X 是 Python 文字值(布尔值、整数、
float、string)或采用模型并返回值的函数:
name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now)
默认情况下,name字段的值为“未知”,而 last_seen字段将为
设置为当前时间。
练习
设置默认值。
添加适当的默认属性,以便:
- 默认卧室数量为 2
- 默认可用日期为 3 个月后
提示:这可能对您有帮助:
today()
检查默认值是否按预期设置。
保留字段
参考:与该主题相关的文档可以在以下位置找到
保留的字段名称。
一些字段名称是为预定义行为保留的。它们应该定义在
模型当需要相关行为时。
练习
添加活动字段。
将
active字段添加到estate.property模型。
重新启动服务器,创建一个新的房产,然后返回到列表视图......房产将
不予列出! active 是具有特定行为的保留字段的示例:
记录具有 active=False,它会自动从任何搜索中删除。要显示
创建了房产后,您将需要专门搜索不活动的记录。
练习
设置活动字段的默认值。
为
active字段设置适当的默认值,使其不再消失。
请注意,默认的 active=False 值已分配给所有现有的记录。
练习
添加状态字段。
将
state字段添加到estate.property模型。有五个可能的值:New、
报价已收到,报价已接受、出售并取消。必须是必须的,不能复制
并应将其默认值设置为“New”。确保使用正确的类型!
state 稍后将用于多项 UI 增强。
现在,由于默认视图,我们能够与 UI 进行交互,下一步是
显而易见:我们要定义 我们自己的看法。
- 1
- 需要刷新,因为 Web 客户端保留了各种菜单的缓存
以及出于性能原因的视图。
老赵解读
菜单、动作和视图把后台模型变成用户真正能操作的业务应用。理解它们之间的链路非常重要:菜单触发动作,动作选择模型和视图,视图决定用户如何读取和修改记录。
Odoo 可以根据字段自动生成默认界面,但默认界面只适合快速验证模型。面向真实用户时,应围绕任务顺序组织字段和操作,让界面表达业务,而不是简单展示数据库字段。