第 6 章:基本视图

我们在 上一章 中已经看到,Odoo 能够为给定的模型生成默认视图。但在实践中,默认视图 永远 无法满足业务应用的要求。相反,我们至少应以合理的方式组织各个字段。

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

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

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

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

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

列表

参考:与该主题相关的文档见 列表。

Note

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

列表视图

列表视图,也称为列表视图,以表格形式显示记录。

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

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

一个简单的示例可参见 这里。

Exercise

添加自定义列表视图。

在相应的 XML 文件中为 estate.property 模型定义一个列表视图。要显示的字段请查看本节的 目标。

提示:

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

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

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

Warning

在本章中您可能会使用一些复制粘贴操作,因此请务必确保每个视图的 id 保持唯一!

Warning

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

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

表单

参考:与该主题相关的文档见 表单。

Note

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

表单视图

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

它们的根元素是 <form>。表单视图由高级结构元素(group 和 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>

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

一个简单的示例可参见 这里。

Exercise

添加自定义表单视图。

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

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

为了避免每次修改视图都要重新启动服务器,可以在启动服务器时使用 --dev xml 参数:

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

使用该参数后,只需刷新页面即可查看对视图的修改。

域

参考:与本主题相关的文档可参阅 搜索域。

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

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

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

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

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

Note

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

Example

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

Exercise

添加筛选和分组(Group By)。

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

  • 一个显示可用房产的筛选器,即状态应为“New”或“Offer Received”。

  • 可按邮政编码对结果进行分组。

看起来不错吧?到目前为止,我们已经能够创建模型,并设计出在业务上合理可用的用户界面。然而,还有一个关键组件缺失:模型之间的关联。