第 5 章:终于,可以玩转一些用户界面(UI)了

现在我们已经创建了新的 模型 及其对应的 访问权限 ,是时候与用户界面(user interface)进行交互了。

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

数据文件(XML)

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

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

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

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

注解

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

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

操作

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

注解

目标:在本节结束时,系统中应加载一个动作。我们在用户界面中还看不到任何内容,但文件应在日志中加载:

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 是一个 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 创建操作。

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

字段、属性和视图

注解

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

模型与视图之间的交互

保留字段 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)

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

Exercise

设置默认值。

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

  • 默认卧室数量为 2

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

提示:这可能会对您有所帮助:today()

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

保留字段

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

一些字段名称为预定义行为保留。当需要相关行为时,应在模型中定义这些字段。

Exercise

添加 active 字段。

estate.property 模型添加 active 字段。

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

非活动记录

Exercise

为 active 字段设置默认值。

active 字段设置适当的默认值,以确保它不会再次消失。

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

Exercise

添加状态字段。

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

Make sure to use the correct type!

稍后将使用 state 来进行一些用户界面(UI)增强。

现在我们已经能够通过默认视图与用户界面(UI)进行交互,下一步显而易见:我们要定义 自己的视图

1

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