原文:Odoo 18 官方开发教程“Server framework 101”第 14 章。本文尽量保留原文结构、代码、练习与图片,仅进行中文翻译,并在文末增加“老赵解读”。
第 14 章:QWeb 简史
到目前为止,我们的房地产模块的界面设计还相当有限。建筑
列表视图很简单,因为只需要字段列表。这同样成立
对于表单视图:尽管使用了一些标签,例如
<group> 或 <page>,但是在设计方面几乎没有什么可做的。
然而,如果我们想给我们的应用程序一个独特的外观,有必要采取一个步骤
进一步并能够设计新的视图。此外,其他功能,例如 PDF 报告或
网站页面需要另一个更灵活的工具来创建:模板化 引擎。
您可能已经熟悉现有的引擎,例如 Jinja (Python)、ERB (Ruby) 或
Twig(PHP)。 Odoo 带有自己的内置引擎:QWeb 模板。
QWeb 是 Odoo 使用的主要模板引擎。它是一个 XML 模板引擎,用于
主要用于生成 HTML 片段和页面。
您可能已经在 Odoo 中遇到过 看板 ,其中记录位于
以卡片状结构显示。我们将为我们的房地产模块构建这样一个视图。
具体示例:看板视图
参考:与该主题相关的文档可以在以下位置找到
看板。
说明
目标:在本节末尾,应创建房产的看板视图:
在我们的房地产应用程序中,我们希望添加一个看板视图来显示我们的房产。看板
视图是标准的 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:一个对象,其属性为所有请求的字段。每个字段都有
两个属性value和raw_value。前者根据当前格式进行格式化
用户参数,后者是来自read()的直接值。
在上面的示例中,字段 name 添加到 <templates> 元素中,但 state
是在它之外。当我们需要字段的值但不想在视图中显示它时,
可以将其添加到 <templates> 元素之外。
练习
改进看板视图。
将以下字段添加到看板视图中:预期价格、最佳价格、销售价格和
标签。注意:只有收到报价时才会显示最优惠价格,而
仅当接受报价时才会显示销售价格。请参阅 目标 该部分的可视化示例。
让我们对我们的视图进行最后的修饰:默认情况下,房产必须按类型分组。你
可能想看看中描述的各种选项
看板。
练习
添加默认分组。
默认情况下,使用适当的属性按类型对房产进行分组。您还必须防止
拖放。请参阅 目标 该部分的可视化示例。
看板视图是一个典型的例子,说明从现有的视图开始总是一个好主意。
查看并微调它,而不是从头开始。有很多选择和课程
可用,所以……阅读和学习!
老赵解读
QWeb 用模板把业务数据转换为 HTML,是报表、网站和部分界面输出的重要基础。学习时不要只记标签语法,更要理解渲染上下文、记录集和模板继承。
模板应专注展示,复杂计算尽量留在 Python 模型中。这样既便于测试,也避免同一业务规则散落在多个报表模板里。输出还要考虑空值、权限、多语言和打印布局。