现在我们已经创建了新模型及其相应的访问权限,是时候与用户界面交互了。
在本章末尾,我们将创建两个菜单,以访问默认列表和表单视图。
数据文件(XML)
参考:与本主题相关的文档可以在数据文件中找到。
在第5章:安全简介中,我们通过CSV文件添加了数据。当要加载的数据具有简单格式时,CSV格式很方便。当格式更复杂时(例如加载视图或电子邮件模板的结构),我们会使用XML格式。例如,此帮助字段包含HTML标记。虽然可以通过CSV文件加载此类数据,但使用XML文件更方便。
XML文件必须添加到与CSV文件相同的文件夹中,并在__manifest__.py
中进行类似的定义。当安装或更新模块时,数据文件的内容也会按顺序加载,因此,对CSV文件的所有注释对XML文件都适用。当数据链接到视图时,我们将其添加到views
文件夹。
在本章中,我们将通过XML文件加载第一个动作和菜单。动作和菜单是数据库中的标准记录。
备注
当性能很重要时,CSV格式优于XML格式。在Odoo中,加载CSV文件比加载XML文件更快。
在Odoo中,用户界面(动作、菜单和视图)在很大程度上通过创建和编写XML文件中定义的记录来定义。常见的模式是菜单 > 动作 > 视图。为了访问记录,用户通过几个菜单级别进行导航;最深层是触发打开记录列表的动作。
动作
参考:与本主题相关的文档可以在Actions中找到。
备注
目标:在本节结束时,应在系统中加载动作。我们在UI中还没有看到任何内容,但文件应该加载到日志中:INFO rd-demo odoo.modules.loading: loading estate/views/estate_property_views.xml
可以通过三种方式触发动作:
- 通过单击菜单项(链接到特定动作)
- 通过单击视图中的按钮(如果这些按钮链接到动作)
- 作为对象上的上下文动作
在本章中,我们只讨论第一种案例。第二个案例将在后面的章节中介绍,而最后一个案例是一个高级主题的重点。在我们的estate
示例中,我们希望将菜单链接到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:是一个外部标识符。它可以用来引用记录(不知道其在数据库中的标识符)。
- model:固定值
ir.actions.act_window
。(窗口动作(ir.actions.act_window))。 - name:动作的名称
- res_model:动作适用的模型。
- view_mode:将提供的视图;在这种情况下,它们是列表(树)和表单视图。我们稍后会看到,还有其他视图模式。
该示例可以在Odoo很多地方找到,但这是一个简单动作的一个很好的例子。请注意XML数据文件的结构,因为您将在以下练习中需要它。
练习
添加一个动作。
在适当的目录创建estate_property_views.xml
文件,并在__manifest __.py
文件中定义它。
为estate.property
模型创建一个动作。
重新启动服务器,您应该会看到日志中加载的文件。
菜单
参考:与本主题相关的文档可以在快捷方式中找到。
备注
目标:在本节结束时,应创建三个菜单,并显示默认视图:
为了减少声明菜单(ir.ui.menu
)链接到相应动作的复杂性,我们可以使用<menuitem>
快捷方式。
在test_model_action
中一个基本的菜单:
<menuitem id="test_model_menu_action" action="test_model_action"/>
菜单test_model_menu_action
链接到test_model_action
动作,该动作链接到test.model
模型。如前所述,动作可以被视为菜单和模型之间的链接。
然而,菜单始终遵循一种架构,实际上有三个级别的菜单:
- 根菜单,显示在应用程序切换器中(Odoo Community App switcher是一个下拉菜单)
- 第一级菜单,显示在顶部栏中
- 动作菜单
定义结构的最简单方法是在XML文件中创建它。我们的test_model_action
的基本结构是:
<menuitem id="test_menu_root" name="Test">
<menuitem id="test_first_level_menu" name="First Level">
<menuitem id="test_model_menu_action" action="test_model_action"/>
</menuitem>
</menuitem>
第三个菜单的名称取自action
的值。
练习
添加菜单。
目标:在本节结束时,Selling Price应为只读,Bedrooms和Available Form应具有默认值。此外,复制记录时不会复制Selling Price和Available Form值。
保留的字段active和state已添加到estate.property模型中。
到目前为止,我们只在房地产广告中使用了通用视图,但在大多数情况下,我们希望对视图进行微调。Odoo有很多微调,但通常第一步是确保:
- 某些字段具有默认值
- 某些字段是只读的
- 复制记录时未复制某些字段
在我们的房地产业务案例中,我们希望:
- Selling Price应为只读(稍后将自动填写)
- 复制记录时,不应复制Available Form和Selling Price
- 默认Bedrooms数应为2
- 默认Available Form应为3个月后
一些新属性
在进一步讨论视图设计之前,让我们回到我们的模型定义。我们看到一些属性,例如required=True
,会影响数据库中的表模式。其他属性将影响视图或提供默认值。
练习
向字段添加新属性。
找到适当的属性(请参见字段)以:
- 将Selling Price设置为只读
- 防止复制Available Form和Selling Price
重新启动服务器并刷新浏览器。你不能设定任何Selling Price。复制记录时,Available Form应为空。
默认值
任何字段都可以给定默认值。在字段定义中,添加选项default=X
,其中X
是Python文字值(布尔、整数、浮点、字符串)或采用模型并返回值的函数:
name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=lambda self: fields.Datetime.now())
默认情况下,name
字段的值为"Unknown",last_seen
字段将设置为当前时间。
练习
设置默认值。
添加适当的默认属性,以便:
- Bedrooms的默认数量为2间
- 默认Available Form应为3个月后
提示:这可能会帮助您:today()
检查默认值是否按预期设置。
保留字段
参考:与本主题相关的文档可以在保留字段名中找到。
为预定义的行为保留了几个字段名。当需要相关行为时,应在模型上定义它们。
练习
添加活动字段。
将active
字段添加到estate.property
模型中。
重新启动服务器,创建新属性,然后返回列表视图…该属性将不会列出!active
是具有特定行为的保留字段的示例:当记录的active=False
时,它会自动从任何搜索中删除。要显示创建的属性,您需要专门搜索非活动记录。
练习
设置活动字段的默认值。
为active
字段设置适当的默认值,以免消失。
请注意,默认的active=False
值已分配给所有现有记录。
练习
添加状态字段。
将stats
字段添加到estate.property
模型中。添加五个可能的值:New, Offer Received, Offer Accepted, Sold 和 Canceled。它们是必须的,不应复制,并且应将其默认值设置为New。
确保使用正确的类型!
该stats
稍后将用于几个UI增强。
基于默认视图,现在我们可以与UI交互,下一步很明显:我们想要定义自己的视图。
提示:由于性能原因,web客户端保留了各种菜单和视图的缓存,因此需要刷新。