第 6 章:终于可以上手 UI 了¶
既然我们已经创建了新的 模型 及其对应的 访问权限,就该与用户界面交互了。
在本章结束时,我们将创建几个菜单,以便访问默认的列表视图和表单视图。
数据文件(XML)¶
参考:与此主题相关的文档可在 数据文件 中找到。
在 第 5 章:安全 - 简要介绍 中,我们通过 CSV 文件添加了数据。当要加载的数据格式简单时,CSV 格式很方便。当格式更复杂时(例如加载视图或邮件模板的结构),我们使用 XML 格式。例如,这个 help 字段 包含 HTML 标签。虽然用 CSV 文件也可以加载这样的数据,但使用 XML 文件更方便。
XML 文件必须添加到与 CSV 文件相同的文件夹中,并在 __manifest__.py 中进行类似定义。数据文件的内容同样是在模块安装或更新时按顺序加载的,因此针对 CSV 文件的所有说明同样适用于 XML 文件。当数据与视图相关时,我们将它们添加到 views 文件夹中。
在本章中,我们将通过一个 XML 文件加载我们的第一个动作和菜单。动作和菜单是数据库中的标准记录。
Note
当性能很重要时,CSV 格式优于 XML 格式。在 Odoo 中就是如此,加载 CSV 文件比加载 XML 文件更快。
在 Odoo 中,用户界面(动作、菜单和视图)主要是通过创建和组合在 XML 文件中定义的记录来构建的。一个常见模式是菜单 > 动作 > 视图。要访问记录,用户需要经过多个菜单层级;最深层级是一个动作,它会触发打开记录列表。
操作¶
参考:与本节主题相关的文档可以在 操作 中找到。
Note
目标:在本节结束时,系统中应已加载一个动作。我们还不会在 UI 中看到任何内容,但日志中应显示该文件已加载:
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">tree,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 创建一个动作。
重启服务器,您应该能在日志中看到该文件已加载。
字段、属性与视图¶
Note
目标:在本节结束时,售价应为只读,卧室数量和可售日期应有默认值。此外,复制记录时不应复制售价和可售日期的值。
在 estate.property 模型中添加了保留字段 active 和 state。
到目前为止,我们的房产广告只使用了通用视图,但在大多数情况下,我们希望对视图进行精细调整。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
添加 state 字段。
为 estate.property 模型添加一个 state 字段。共有五个可选值:’新建’、’已收到报价’、’已接受报价’、’已售出’ 和 ‘已取消’。该字段必须为必填项、不应被复制,并且默认值应设置为 ‘新建’。
请务必使用正确的类型!
state 字段稍后将用于多项 UI 增强。
既然借助默认视图我们已经能够与 UI 交互,下一步就很明显了:我们要定义 我们自己的视图。
- 1
需要刷新页面,因为出于性能考虑,Web 客户端会缓存各种菜单和视图。