第 6 章:基础视图

我们在 上一章 中已经看到,Odoo 能够为给定模型生成默认视图。但在实践中,默认视图对于业务应用来说 永远 不可接受。相反,我们至少应以合乎逻辑的方式组织各个字段。

视图与动作和菜单一样,都在 XML 文件中定义。它们是 ir.ui.view 模型的实例。

在我们的房地产模块中,我们需要以合乎逻辑的方式组织字段:

  • 在列表视图中,我们希望显示的不只是名称。

  • 在表单视图中,字段应进行分组。

  • 在搜索视图中,我们必须能够不仅仅按名称进行搜索。具体来说,我们希望有一个筛选 ‘Available’ 房产的过滤器,以及一个按邮编分组的快捷方式。

列表

参考:本主题相关文档请参阅 列表。

注解

目标:本节结束时,列表视图应如下所示:

列表视图

列表视图以表格形式显示记录。

其根元素为 <list>。该视图最基本的版本只是列出要在表格中显示的所有字段(每个字段为一列):

<list string="Tests">
    <field name="name"/>
    <field name="last_seen"/>
</list>

这里 有一个简单的示例。

练习

添加自定义列表视图。

在合适的 XML 文件中为 estate.property 模型定义一个列表视图。要显示的字段请参阅本节的 目标。

提示:

  • 不要添加上面示例中出现的 editable="bottom" 属性。我们稍后会再讨论它。

  • 某些字段标签可能需要调整,以与参考图一致。

一如既往,你需要重启服务器(别忘了 -u 选项)并刷新浏览器才能看到结果。

警告

本章中你可能会用到复制粘贴,因此务必确保每个视图的 id 保持唯一!

警告

记得按照 安全性简介 中的说明为用户设置正确的访问权限!

如果用户只有读取权限,则不会显示 创建 按钮。

窗体

参考:本主题相关文档请参阅 窗体。

注解

目标:本节结束时,表单视图应如下所示:

表单视图

表单用于创建和编辑单条记录。

其根元素为 <form>。它们由高层结构元素(分组和 notebook)以及交互元素(按钮和字段)组成:

<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>

也可以使用 div、h1 等常规 HTML 标签以及 class 属性(Odoo 提供了一些内置类)来微调外观。

这里 有一个简单的示例。

练习

添加自定义表单视图。

在合适的 XML 文件中为 estate.property 模型定义一个表单视图。页面预期的最终设计请参阅本节的 目标。

在达到预期结果之前,你可能需要反复尝试 ;-) 建议你一次只添加一个字段和一个标签,以便理解其工作原理。

为了避免每次修改视图后都重新启动服务器,在启动服务器时使用 --dev xml 参数会很方便:

$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate --dev xml

该参数让你只需刷新页面即可查看对视图的修改。

域

参考:与本主题相关的文档可在 搜索域 中找到。

在 Odoo 中,域用于编码记录上的条件:域是一个条件列表,用于选取模型中记录的子集。每个条件都是一个三元组,包含 字段名、运算符 和 值。如果指定字段满足运算符作用于该值所设定的条件,则该记录满足此条件。

例如,在 产品 模型上使用时,以下域会选取所有单价大于 1000 的 服务:

[('product_type', '=', 'service'), ('unit_price', '>', 1000)]

默认情况下,条件之间以隐式 AND 组合,也就是说记录必须满足 每一个 条件才能匹配某个域。可以使用逻辑运算符 & (AND)、| (OR)和 ! (NOT)来显式组合条件。它们采用前缀位置(运算符插入在其参数之前,而不是参数之间)。例如,要选取“属于服务 OR 单价 不在 1000 与 2000 之间”的产品:

['|',
    ('product_type', '=', 'service'),
    '!', '&',
        ('unit_price', '>=', 1000),
        ('unit_price', '<', 2000)]

注解

XML 不允许在 XML 元素内使用 < 和 &。为避免解析错误,应使用实体引用:< 用 &lt;,& 用 &amp;。其他实体引用(&gt;、&apos; 和 &quot;)是可选的。

示例

<filter name="negative" domain="[('test_val', '&lt;', 0)]"/>

练习

添加过滤器和分组依据。

应将以下内容添加到之前创建的搜索视图中:

  • 一个用于显示可用房产的过滤器,即状态应为“New”(新建)或“Offer Received”(已收到报价)。

  • 能够按邮编对结果进行分组。

还不错吧?至此我们已经能够创建模型并设计出符合业务需求的用户界面。然而,还缺少一个关键部分:模型之间的关联。