第 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
操作可以通过三种方式触发:
通过点击菜单项(链接到特定操作)
通过点击视图中的按钮(如果这些按钮连接到操作)
作为对象上的上下文操作
我们将在本章中仅讨论第一种情况。第二种情况将在 后续章节 中讨论,而最后一种情况则是高级主题的重点。在我们的房地产示例中,我们希望将菜单链接到 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
创建操作。
重启服务器,您应该会在日志中看到文件已加载。
字段、属性和视图¶
注解
目标:在本节结束时,销售价格应为只读,卧室数量和可用日期应具有默认值。此外,当记录被复制时,销售价格和可用日期的值不会被复制。

保留字段 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)
name
字段的默认值将为 “Unknown” ,而 last_seen
字段将被设置为当前时间。
检查默认值是否按预期设置。
保留字段¶
参考:与此主题相关的文档可在 保留字段名称 中找到。
一些字段名称为预定义行为保留。当需要相关行为时,应在模型中定义这些字段。
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客户端出于性能原因会缓存各种菜单和视图,因此需要刷新。