Chapter 5: Finally, Some UI To Play With

Now that we’ve created our new model and its corresponding access rights, it is time to interact with the user interface.

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

数据文件(XML)

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

In Chapter 4: Security - A Brief Introduction, we added data through a CSV file. The CSV format is convenient when the data to load has a simple format. When the format is more complex (e.g. load the structure of a view or an email template), we use the XML format. For example, this help field contains HTML tags. While it would be possible to load such data through a CSV file, it is more convenient to use an XML file.

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

In this chapter, we will load our first action and menus through an XML file. Actions and menus are standard records in the database.

注解

当性能很重要时,CSV格式比XML格式更受欢迎。这在Odoo中是这种情况,因为加载CSV文件比加载XML文件更快。

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

操作

Reference: the documentation related to this topic can be found in 操作.

注解

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

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

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

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

  2. 通过在视图中点击按钮(如果这些按钮连接到操作)

  3. 作为对象上下文操作

We will only cover the first case in this chapter. The second case will be covered in a later chapter while the last is the focus of an advanced topic. In our Real Estate example, we would like to link a menu to the estate.property model, so we are able to create a new record. The action can be viewed as the link between the menu and the model.

我们的 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 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 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

添加状态字段。

Add a state field to the estate.property model. Five values are possible: New, Offer Received, Offer Accepted, Sold and Cancelled. It must be required, should not be copied and should have its default value set to ‘New’.

确保使用正确的类型!

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

Now that we are able to interact with the UI thanks to the default views, the next step is obvious: we want to define our own views.

1

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