第 5 章:终于有点界面可以玩了¶
既然我们已经创建了新的 模型 及其对应的 访问权限,现在该与用户界面交互了。
在本章结束时,我们将创建几个菜单,用于访问默认的列表视图和表单视图。
数据文件(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是 外部标识符。它可用于引用记录(无需知道其在数据库中的标识符)。model的固定值为ir.actions.act_window(窗口动作(ir.actions.act_window))。name是动作的名称。res_model是动作所适用的模型。view_mode是可用的视图;在本例中为列表视图和表单视图。我们将在 后续内容 中看到还可以有其他视图模式。
在 Odoo 中随处可见这类示例,而这个 示例 就是一个简单动作的好例子。请注意 XML 数据文件的结构,因为你在后续练习中会用到它。
练习
添加一个动作。
在合适的文件夹中创建 estate_property_views.xml 文件,并在 __manifest__.py 文件中定义它。
为 estate.property 模型创建一个动作。
重启服务器,你应该能在日志中看到该文件已加载。
字段、属性与视图¶
注解
目标:本节结束时,售价应为只读,卧室数量和可售日期应具有默认值。此外,复制记录时不应复制售价和可售日期的值。
已将保留字段 active 和 state 添加到 estate.property 模型。
到目前为止,我们只对房地产广告使用了通用视图,但在大多数情况下,我们希望对视图进行微调。Odoo 中有许多可微调之处,但通常第一步是确保:
某些字段具有默认值
某些字段为只读
复制记录时某些字段不会被复制
在我们的房地产业务场景中,我们希望实现以下效果:
售价应为只读(稍后将自动填充)
复制记录时不应复制可售日期和售价
卧室数量的默认值应为 2
可售日期的默认值应为 3 个月后
一些新属性¶
在进一步设计视图之前,让我们先回到模型定义。我们已看到,某些属性(例如 required=True)会影响数据库中的表结构。其他属性则会影响视图或提供默认值。
练习
为字段添加新属性。
找到合适的属性(参见 Field)来:
将售价设为只读
阻止复制可售日期和售价的值
重启服务器并刷新浏览器。你应该无法设置任何售价。复制记录时,可售日期应为空。
默认值¶
任何字段都可以指定默认值。在字段定义中,添加选项 default=X,其中 X 可以是 Python 字面值(布尔值、整数、浮点数、字符串),也可以是一个接受模型并返回值的函数:
name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now)
name 字段的默认值为 ‘Unknown’,而 last_seen 字段将被设置为当前时间。
练习
设置默认值。
添加合适的默认属性,使得:
卧室数量的默认值为 2
可售日期的默认值为 3 个月后
提示:以下方法可能对你有帮助:today()
检查默认值是否按预期设置。
保留字段¶
参考:本主题相关文档请参阅 保留字段名。
有几个字段名是为预定义行为保留的。当需要相应行为时,应在模型上定义它们。
练习
添加 active 字段。
为 estate.property 模型添加 active 字段。
重启服务器,创建一条新房产记录,然后回到列表视图……该房产不会被列出!active 是保留字段具有特殊行为的一个例子:当记录为 active=False 时,它会自动从任何搜索中移除。要显示已创建的房产,你需要专门搜索非活动记录。
练习
为 active 字段设置默认值。
为 active 字段设置合适的默认值,使其不再消失。
请注意,默认值 active=False 已分配给所有现有记录。
练习
添加 state 字段。
为 estate.property 模型添加 state 字段。可选值有五个:New、Offer Received、Offer Accepted、Sold 和 Cancelled。该字段必须是必填的,不应被复制,并且默认值应设为 ‘New’。
确保使用正确的类型!
state 稍后将用于多项界面增强。
现在我们已经可以借助默认视图与界面交互,下一步不言而喻:我们要定义 自己的视图。
- 1
需要刷新,因为出于性能考虑,Web 客户端会缓存各种菜单和视图。