第5章:终于,有了可以操作的UI¶
既然我们已经创建了新的 模型 及其对应的 访问权限,现在是时候与用户界面进行交互了。
在本章结束时,我们将创建一些菜单以便访问默认的列表和表单视图。
数据文件(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
操作可以通过三种方式触发:
通过点击菜单项(链接到特定操作)
通过在视图中点击按钮(如果这些按钮连接到操作)
作为对象上下文操作
本章我们仅讨论第一种情况。第二种情况将在 后续章节 中介绍,而最后一种情况则是高级主题的重点。在我们的房地产示例中,我们希望将菜单链接到 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
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
是可用的视图模式;在本例中,它们是列表视图和表单视图。我们将在 后续章节 中看到,还可以有其他视图模式。
在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
创建一个动作。
重启服务器,您应该可以在日志中看到文件已加载。
字段,属性和视图¶
注解
目标:在本节结束时,销售价格应为只读,卧室数量和可用日期应具有默认值。此外,当记录被复制时,销售价格和可用日期的值不会被复制。
保留字段 active
和 state
已添加到 estate.property
模型中。
到目前为止,我们只使用了通用视图来展示我们的房地产广告,但在大多数情况下,我们希望对视图进行微调。Odoo中有许多微调选项,但通常的第一步是确保:
一些字段有默认值
一些字段是只读的
复制记录时某些字段未被复制
在我们的房地产业务案例中,我们希望以下内容:
售价应该是只读的(稍后将自动填写)
在复制记录时,不应复制可用日期和销售价格
默认卧室数量应为2
默认可用日期应为3个月后
一些新属性¶
在继续进行视图设计之前,让我们回到模型定义。我们看到一些属性,比如 required=True
,会影响数据库中的表结构。其他属性将影响视图或提供默认值。
重启服务器并刷新浏览器。您将无法设置任何销售价格。复制记录时,可用日期应为空。
默认值¶
任何字段都可以给定默认值。在字段定义中,添加选项 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
添加活动字段。
在 estate.property
模型中添加 active
字段。
重启服务器,创建一个新的属性,然后返回到列表视图… 属性将不会被列出! active
是一个具有特定行为的保留字段的示例:当记录的 active=False
时,它会自动从任何搜索中移除。要显示创建的属性,您需要专门搜索非活动记录。
Exercise
为活动字段设置默认值。
设置适当的默认值,使 active
字段不再消失。
请注意,所有现有记录都被分配了默认值 active=False
。
Exercise
添加状态字段。
在 estate.property
模型中添加一个 state
字段。该字段有五个可能的值:New(新建)、Offer Received(收到报价)、Offer Accepted(接受报价)、Sold(已售出)和 Cancelled(已取消)。该字段必须为必填项,不应被复制,并且其默认值应设置为 ‘New’。
确保使用正确的类型!
The state
will be used later on for several UI enhancements.
既然我们能够通过默认视图与用户界面进行交互,下一步显而易见:我们想要定义 我们自己的视图。
- 1
由于Web客户端为了提高性能而缓存了各种菜单和视图,因此需要刷新。