第 5 章:终于有点界面可以玩了

既然我们已经创建了新的 模型 及其对应的 访问权限,现在该与用户界面交互了。

在本章结束时,我们将创建几个菜单,用于访问默认的列表视图和表单视图。

数据文件(XML)

参考:本主题相关的文档可在 数据文件 中找到。

在 第 4 章:安全性 - 简要介绍 中,我们通过 CSV 文件添加了数据。当要加载的数据格式简单时,CSV 格式很方便。当格式更复杂时(例如加载视图的结构或电子邮件模板),我们使用 XML 格式。例如,这个 帮助字段 包含 HTML 标签。虽然通过 CSV 文件加载此类数据也是可行的,但使用 XML 文件更为方便。

XML 文件必须添加到与 CSV 文件相同的文件夹中,并以类似方式在 __manifest__.py 中定义。数据文件的内容同样在模块安装或更新时依次加载,因此针对 CSV 文件的所有说明同样适用于 XML 文件。当数据与视图关联时,我们将其放入 views 文件夹。

在本章中,我们将通过 XML 文件加载第一个动作和菜单。动作和菜单是数据库中的标准记录。

注解

当性能很重要时,CSV 格式优于 XML 格式。在 Odoo 中就是如此,加载 CSV 文件比加载 XML 文件更快。

在 Odoo 中,用户界面(动作、菜单和视图)主要通过创建并组合 XML 文件中定义的记录来定义。常见的模式是菜单 > 动作 > 视图。用户通过逐级浏览多个菜单层级来访问记录;最深的一层是动作,它会触发打开记录列表。

操作

参考:本主题相关文档请参阅 操作。

注解

目标:本节结束时,系统中应已加载一个动作。此时界面上还看不到任何内容,但日志中应显示该文件已加载:

INFO rd-demo odoo.modules.loading: loading estate/views/estate_property_views.xml

动作可以通过三种方式触发:

  1. 通过点击菜单项(链接到特定动作)

  2. 通过点击视图中的按钮(如果这些按钮与动作相连)

  3. 作为对象上的上下文动作

本章只介绍第一种情况。第二种情况将在 后续章节 中介绍,最后一种则是某个高级主题的重点。在我们的房地产示例中,我们希望将菜单链接到 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 模型创建一个动作。

重启服务器,你应该能在日志中看到该文件已加载。

字段、属性与视图

注解

目标:本节结束时,售价应为只读,卧室数量和可售日期应具有默认值。此外,复制记录时不应复制售价和可售日期的值。

模型与视图之间的交互

已将保留字段 active 和 state 添加到 estate.property 模型。

到目前为止,我们只对房地产广告使用了通用视图,但在大多数情况下,我们希望对视图进行微调。Odoo 中有许多可微调之处,但通常第一步是确保:

  • 某些字段具有默认值

  • 某些字段为只读

  • 复制记录时某些字段不会被复制

在我们的房地产业务场景中,我们希望实现以下效果:

  • 售价应为只读(稍后将自动填充)

  • 复制记录时不应复制可售日期和售价

  • 卧室数量的默认值应为 2

  • 可售日期的默认值应为 3 个月后

一些新属性

在进一步设计视图之前,让我们先回到模型定义。我们已看到,某些属性(例如 required=True)会影响数据库中的表结构。其他属性则会影响视图或提供默认值。

练习

为字段添加新属性。

找到合适的属性(参见 Field)来:

  • 将售价设为只读

  • 阻止复制可售日期和售价的值

重启服务器并刷新浏览器。你应该无法设置任何售价。复制记录时,可售日期应为空。

默认值

任何字段都可以指定默认值。在字段定义中,添加选项 default=X,其中 X 可以是 Python 字面值(布尔值、整数、浮点数、字符串),也可以是一个接受模型并返回值的函数:

name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now)

name 字段的默认值为 ‘Unknown’,而 last_seen 字段将被设置为当前时间。

练习

设置默认值。

添加合适的默认属性,使得:

  • 卧室数量的默认值为 2

  • 可售日期的默认值为 3 个月后

提示:以下方法可能对你有帮助:today()

检查默认值是否按预期设置。

保留字段

参考:本主题相关文档请参阅 保留字段名。

有几个字段名是为预定义行为保留的。当需要相应行为时,应在模型上定义它们。

练习

添加 active 字段。

为 estate.property 模型添加 active 字段。

重启服务器,创建一条新房产记录,然后回到列表视图……该房产不会被列出!active 是保留字段具有特殊行为的一个例子:当记录为 active=False 时,它会自动从任何搜索中移除。要显示已创建的房产,你需要专门搜索非活动记录。

非活动记录

练习

为 active 字段设置默认值。

为 active 字段设置合适的默认值,使其不再消失。

请注意,默认值 active=False 已分配给所有现有记录。

练习

添加 state 字段。

为 estate.property 模型添加 state 字段。可选值有五个:New、Offer Received、Offer Accepted、Sold 和 Cancelled。该字段必须是必填的,不应被复制,并且默认值应设为 ‘New’。

确保使用正确的类型!

state 稍后将用于多项界面增强。

现在我们已经可以借助默认视图与界面交互,下一步不言而喻:我们要定义 自己的视图。

1

需要刷新,因为出于性能考虑,Web 客户端会缓存各种菜单和视图。