第6章:基本观点¶
我们在 previous chapter 中看到 Odoo 能够为给定模型生成默认视图。实际上,业务应用程序**永远**不接受默认视图。相反,我们至少应该以逻辑的方式组织各个领域。
视图在带有操作和菜单的 XML 文件中定义。它们是“ir.ui.view”模型的实例。
在我们的房地产模块中,我们需要以逻辑方式组织字段:
在列表视图中,我们想要显示的不仅仅是名称。
在表单视图中,字段应该被分组。
在搜索视图中,我们必须能够搜索的不仅仅是名称。具体来说,我们需要一个“可用”属性的过滤器和一个按邮政编码分组的快捷方式。
列表¶
参考:与此主题相关的文档可以在 列表 中找到。
注解
目标:在本节末尾,列表视图应如下所示:
列表视图,也称为列表视图,以表格形式显示记录。
它们的根元素是“<list>”。此视图的最基本版本只是列出要在表中显示的所有字段(其中每个字段都是一列):
<list string="Tests">
<field name="name"/>
<field name="last_seen"/>
</list>
可以找到一个简单的示例 here。
Exercise
添加自定义列表视图。
在相应的 XML 文件中定义“estate.property”模型的列表视图。检查此部分的 目标 以获取要显示的字段。
尖端:
不要添加上例中的“
editable="bottom"”属性。我们稍后再讨论这个问题。某些字段标签可能需要进行调整以匹配参考。
与往常一样,您需要重新启动服务器(不要忘记``-u``选项)并刷新浏览器才能看到结果。
警告
在本章中您可能会使用一些复制粘贴,因此请始终确保“id”对于每个视图保持唯一!
形式¶
参考:与此主题相关的文档可以在 形式 中找到。
注解
目标:在本节末尾,表单视图应如下所示:
表单用于创建和编辑单个记录。
它们的根元素是“<form>”。它们由高级结构元素(组和笔记本)和交互元素(按钮和字段)组成:
<form string="Test">
<sheet>
<group>
<group>
<field name="name"/>
</group>
<group>
<field name="last_seen"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</sheet>
</form>
可以使用常规 HTML 标签,例如 div and h1 as well as the the class 属性(Odoo 提供了一些内置类)来微调外观。
可以找到一个简单的示例 here。
Exercise
添加自定义表单视图。
在适当的 XML 文件中为“estate.property”模型定义一个表单视图。检查本节的 目标 以了解页面的预期最终设计。
在获得预期结果之前,这可能需要一些尝试和错误;-) 建议您一次添加一个字段和标签,以帮助理解其工作原理。
为了避免每次修改视图时都重新启动服务器,在启动服务器时使用``–dev xml``参数可以很方便:
$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate --dev xml
该参数允许您只需刷新页面即可查看您的视图修改。
搜索¶
参考:与此主题相关的文档可以在 搜索 中找到。
注解
目标:在本节末尾,搜索视图应如下所示:
搜索视图与列表和表单视图略有不同,因为它们不显示*内容*。尽管它们适用于特定模型,但它们用于过滤其他视图的内容(通常是聚合视图,例如 列表)。除了用例的差异之外,它们的定义方式相同。
它们的根元素是“<search>”。该视图最基本的版本只是列出了需要快捷方式的所有字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>
Odoo 生成的默认搜索视图提供了按“name”进行过滤的快捷方式。在自定义搜索视图中添加用户可能过滤的字段是很常见的。
Exercise
添加自定义搜索视图。
在相应的 XML 文件中定义“estate.property”模型的搜索视图。检查本节的**目标**的第一张图片以获取字段列表。
重新启动服务器后,应该可以过滤给定的字段。
搜索视图还可以包含“<filter>”元素,它们充当预定义搜索的切换开关。过滤器必须具有以下属性之一:
domain:将给定域添加到当前搜索中context: adds some context to the current search; uses the keygroup_by对给定字段名称的结果进行分组
可以找到一个简单的示例 here。
在进一步练习之前,有必要介绍“域”的概念。
域名¶
参考:与此主题相关的文档可以在 搜索域 中找到。
在 Odoo 中,域对记录条件进行编码:域是用于选择模型记录子集的标准列表。每个条件都是一个带有*字段名称*、*运算符*和*值*的三元组。如果指定字段满足应用于该值的运算符的条件,则记录满足条件。
例如,当用于 Product 模型时,以下域选择单价大于 1000 的所有 services:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件与隐式 AND 组合,这意味着记录需要满足*每个*条件才能匹配域。逻辑运算符 & (AND), | (OR) and ! (NOT) 可用于显式组合条件。它们用在前缀位置(运算符插入在其参数之前而不是之间)。例如,要选择“服务*或*单价*不*在 1000 到 2000 之间”的产品::
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
注解
XML 不允许 < and & to be used inside XML elements. To avoid parsing errors, entity references should be used: < for < and & for &. Other entity references (>, ' & ") 是可选的。
Example
<filter name="negative" domain="[('test_val', '<', 0)]"/>
Exercise
添加过滤器和分组依据。
应将以下内容添加到先前创建的搜索视图中:
显示可用属性的过滤器,即状态应为“新”或“已收到报价”。
按邮政编码对结果进行分组的能力。
看起来不错吗?此时,我们已经能够创建模型并设计对业务有意义的用户界面。然而,仍然缺少一个关键组件:link between models。