第六章:终于有一些界面可以玩了

现在我们已经创建了新的 model 和相应的 access rights,现在是时候与用户界面进行交互了。

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

数据文件(XML)

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

第五章:安全性 - 简介 中,我们通过 CSV 文件添加了数据。当要加载的数据具有简单的格式时,CSV 格式很方便。当格式更复杂时(例如加载视图结构或电子邮件模板),我们使用 XML 格式。例如,这个 help 字段 包含 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">tree,form</field>
</record>
  • id is an external identifier. It can be used to refer to the record (without knowing its in-database identifier).

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

  • name is the name of the action.

  • res_model is the model which the action applies to.

  • view_mode are the views that will be available; in this case they are the list (tree) and form views. We’ll see later that there can be other view modes.

在Odoo中,到处都可以找到示例,但是 this <https://github.com/odoo/odoo/blob/09c59012bf80d2ccbafe21c39e604d6cfda72924/addons/crm/views/crm_lost_reason_views.xml#L57-L70> __是一个简单操作的好例子。请注意XML数据文件的结构,因为您将在接下来的练习中需要它。

Exercise

添加一个操作。

在适当的文件夹中创建 estate_property_views.xml 文件,并在 __manifest__.py 文件中定义它。

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

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

字段,属性和视图

注解

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

模型和视图之间的交互

保留字段 activestate 已添加到 estate.property 模型中。

到目前为止,我们只使用了通用视图来展示我们的房地产广告,但在大多数情况下,我们希望对视图进行微调。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)

The name field will have the value ‘Unknown’ by default while the last_seen field will be set as the current time.

Exercise

设置默认值。

添加适当的默认属性,以便:

  • 默认卧室数量为2

  • 默认可用日期为3个月后

提示:这可能对你有帮助: today()

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

保留字段

参考: 有关此主题的文档可以在 保留字段名称 中找到。

一些字段名称被预定义为特定行为。当相关行为被需要时,它们应该在模型上进行定义。

Exercise

添加活动字段。

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

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

非活动记录

Exercise

为活动字段设置默认值。

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

请注意,所有现有记录都被分配了默认值 active=False

Exercise

添加状态字段。

estate.property 模型中添加一个 state 字段。有五个可能的值:New,Offer Received,Offer Accepted,Sold 和 Canceled。它必须是必需的,不应该被复制,并且应该将其默认值设置为“New”。

确保使用正确的类型!

The state will be used later on for several UI enhancements.

现在我们能够通过默认视图与用户界面进行交互,下一步很明显:我们想要定义: 我们自己的视图

1

由于Web客户端为了提高性能而缓存了各种菜单和视图,因此需要刷新。