跳至内容

老赵解读Odoo 18开发教程14:QWeb报表入门

2026年8月15日
老赵解读Odoo 18开发教程14:QWeb报表入门

原文:Odoo 18 官方开发教程“Server framework 101”第 14 章。本文尽量保留原文结构、代码、练习与图片,仅进行中文翻译,并在文末增加“老赵解读”。

第 14 章:QWeb 简史


到目前为止,我们的房地产模块的界面设计还相当有限。建筑
列表视图很简单,因为只需要字段列表。这同样成立
对于表单视图:尽管使用了一些标签,例如 <group><page>,但是
在设计方面几乎没有什么可做的。

然而,如果我们想给我们的应用程序一个独特的外观,有必要采取一个步骤
进一步并能够设计新的视图。此外,其他功能,例如 PDF 报告或
网站页面需要另一个更灵活的工具来创建:模板化 引擎。

您可能已经熟悉现有的引擎,例如 Jinja (Python)、ERB (Ruby) 或
Twig(PHP)。 Odoo 带有自己的内置引擎:QWeb 模板
QWeb 是 Odoo 使用的主要模板引擎。它是一个 XML 模板引擎,用于
主要用于生成 HTML 片段和页面。

您可能已经在 Odoo 中遇到过 看板 ,其中记录位于
以卡片状结构显示。我们将为我们的房地产模块构建这样一个视图。

具体示例:看板视图

参考:与该主题相关的文档可以在以下位置找到
看板

说明

目标:在本节末尾,应创建房产的看板视图:

Kanban view

在我们的房地产应用程序中,我们希望添加一个看板视图来显示我们的房产。看板
视图是标准的 Odoo 视图(如表单和列表视图),但它们的结构要复杂得多
灵活。事实上,每张卡片的结构都是表单元素的混合(包括基本的 HTML)
和QWeb。看板视图的定义与列表和表单的定义类似
视图,不同之处在于它们的根元素是 <kanban>。最简单的形式是看板视图
看起来像:

<kanban>
    <templates>
        <t t-name="kanban-box">
            <div>
                <field name="name"/>
            </div>
        </t>
    </templates>
</kanban>

让我们分解一下这个例子:

  • <templates>:定义 QWeb 模板 模板列表。看板视图 必须 定义于
    至少一个根模板 kanban-box,将为每个记录渲染一次。
  • <t t-name="kanban-box"><t> 是 QWeb 指令的占位符元素。在这种情况下,
    用于将模板的 name 设置为 kanban-box
  • <field name="name"/>:这会将 name字段添加到视图中。

练习

制作最小的看板视图。

使用提供的简单示例,为房产创建一个最小的看板视图。的
仅字段显示的是 name

提示:必须在对应的 view_mode中添加 kanban
ir.actions.act_window

一旦看板视图发挥作用,我们就可以开始改进它。如果我们想显示一个元素
有条件时,我们可以使用 t-if 指令(请参阅 条件句)。

<kanban>
    <field name="state"/>
    <templates>
        <t t-name="kanban-box">
            <div>
                <field name="name"/>
                <div t-if="record.state.raw_value == 'new'">
                    This is new!
                </div>
            </div>
        </t>
    </templates>
</kanban>

我们添加了一些内容:

  • t-if:如果条件为真,则呈现 <div> 元素。
  • record:一个对象,其属性为所有请求的字段。每个字段都有
    两个属性 valueraw_value。前者根据当前格式进行格式化
    用户参数,后者是来自 read() 的直接值。

在上面的示例中,字段 name 添加到 <templates> 元素中,但 state
是在它之外。当我们需要字段的值但不想在视图中显示它时,
可以将其添加到 <templates> 元素之外。

练习

改进看板视图。

将以下字段添加到看板视图中:预期价格、最佳价格、销售价格和
标签。注意:只有收到报价时才会显示最优惠价格,而
仅当接受报价时才会显示销售价格。

请参阅 目标 该部分的可视化示例。

让我们对我们的视图进行最后的修饰:默认情况下,房产必须按类型分组。你
可能想看看中描述的各种选项
看板

练习

添加默认分组。

默认情况下,使用适当的属性按类型对房产进行分组。您还必须防止
拖放。

请参阅 目标 该部分的可视化示例。

看板视图是一个典型的例子,说明从现有的视图开始总是一个好主意。
查看并微调它,而不是从头开始。有很多选择和课程
可用,所以……阅读和学习!

老赵解读

QWeb 用模板把业务数据转换为 HTML,是报表、网站和部分界面输出的重要基础。学习时不要只记标签语法,更要理解渲染上下文、记录集和模板继承。

模板应专注展示,复杂计算尽量留在 Python 模型中。这样既便于测试,也避免同一业务规则散落在多个报表模板里。输出还要考虑空值、权限、多语言和打印布局。

老赵解读Odoo 18开发教程13:与其他模块协作