第 6 章:终于可以上手 UI 了

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

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

数据文件(XML)

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

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

XML 文件必须添加到与 CSV 文件相同的文件夹中,并在 __manifest__.py 中进行类似定义。数据文件的内容同样是在模块安装或更新时按顺序加载的,因此针对 CSV 文件的所有说明同样适用于 XML 文件。当数据与视图相关时,我们将它们添加到 views 文件夹中。

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

Note

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

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

操作

参考:与本节主题相关的文档可以在 操作 中找到。

Note

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

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">tree,form</field>
</record>
  • id 是一个 external identifier。它可用于引用记录(无需知道其在数据库中的标识符)。

  • model 的值固定为 ir.actions.act_window 窗口动作(ir.actions.act_window))。

  • name 是动作的名称。

  • res_model 是动作所作用的目标模型。

  • view_mode 指定将可用的视图;在本例中是列表(树)视图和表单视图。我们将在 后面 看到,还可以有其他的视图模式。

在 Odoo 中随处都可以找到示例,但 这个 是简单动作的一个好例子。请留意 XML 数据文件的结构,因为在接下来的练习中会用到它。

Exercise

添加一个动作。

在合适的文件夹中创建 estate_property_views.xml 文件,并在 __manifest__.py 文件中进行定义。

为模型 estate.property 创建一个动作。

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

字段、属性与视图

Note

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

模型与视图的交互

在 estate.property 模型中添加了保留字段 active 和 state。

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

  • 某些字段具有默认值

  • 某些字段为只读

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

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

  • 售价应为只读(稍后会自动填入)

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

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

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

一些新属性

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

Exercise

为字段添加新属性。

找到合适的属性(参见 Field ),以便:

  • 将售价设为只读

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

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

默认值

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

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

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

Exercise

设置默认值。

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

  • 卧室数量的默认值为 2

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

提示:这或许能帮到您:today()

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

保留字段

参考:与该主题相关的文档见 保留字段名。

少数字段名称被保留用于预定义的行为。当需要相关行为时,应在模型中定义这些字段。

Exercise

添加 active 字段。

在 estate.property 模型中添加 active 字段。

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

非活动记录

Exercise

为 active 字段设置默认值。

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

请注意,默认的 active=False 值已被赋予所有现有记录。

Exercise

添加 state 字段。

为 estate.property 模型添加一个 state 字段。共有五个可选值:’新建’、’已收到报价’、’已接受报价’、’已售出’ 和 ‘已取消’。该字段必须为必填项、不应被复制,并且默认值应设置为 ‘新建’。

请务必使用正确的类型!

state 字段稍后将用于多项 UI 增强。

既然借助默认视图我们已经能够与 UI 交互,下一步就很明显了:我们要定义 我们自己的视图。

1

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