第 14 章:QWeb 简史¶
到目前为止,我们房地产模块的界面设计还相当有限。构建列表视图很直接,因为只需要字段列表。表单视图也是如此:尽管用到了 <group> 或 <page> 等少数标签,但在设计方面几乎没有什么要做的工作。
然而,如果我们想为应用赋予独特的外观,就需要更进一步,能够设计新的视图。此外,PDF 报表或网站页面等其他功能需要另一种更灵活的工具来创建:一个 templating 引擎。
你可能已经熟悉 Jinja(Python)、ERB(Ruby)或 Twig(PHP)等现有引擎。Odoo 自带一个内置引擎:QWeb 模板。QWeb 是 Odoo 使用的主要模板引擎。它是一个 XML 模板引擎,主要用于生成 HTML 片段和页面。
你可能已经在 Odoo 中见过 kanban board (看板),其中记录以卡片式的结构显示。我们将为房地产模块构建这样一个视图。
具体示例:看板视图¶
参考:与本主题相关的文档可在 看板 中找到。
注解
目标:本节结束时,应创建房产的看板视图:
在我们的房地产应用中,我们希望添加一个看板视图来显示房产。看板视图是 Odoo 的标准视图(与表单视图和列表视图一样),但其结构灵活得多。实际上,每张卡片的结构都是表单元素(包括基础 HTML)与 QWeb 的混合。看板视图的定义与列表视图和表单视图类似,只是其根元素是 <kanban>。最简单形式的看板视图如下:
<kanban>
<templates>
<t t-name="card">
<div>
<field name="name"/>
</div>
</t>
</templates>
</kanban>
我们来逐一分析这个示例:
<templates>:定义 QWeb 模板 模板的列表。看板视图 必须 至少定义一个根模板card,该模板会为每条记录渲染一次。<t t-name="card">:<t>是 QWeb 指令的占位元素。在这里,它用于将模板的name设置为card<field name="name"/>:这会将name字段添加到视图中。
练习
创建一个最小的看板视图。
使用提供的简单示例,为房产创建一个最小的看板视图。唯一需要显示的字段是 name。
提示:你必须在相应的 ir.actions.act_window 的 view_mode 中添加 kanban。
看板视图可以正常工作后,我们就可以开始改进它。如果我们想有条件地显示某个元素,可以使用 t-if 指令(参见 条件判断)。
<kanban>
<field name="state"/>
<templates>
<t t-name="card">
<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> 元素之外。
练习
改进看板视图。
将以下字段添加到看板视图:预期价格、最佳价格、销售价格和标签。请注意:只有在收到报价时才显示最佳价格,而只有在接受报价后才显示销售价格。
可视化示例请参阅该节的 目标。
让我们给视图做最后的润色:房产必须默认按类型分组。你或许想看看 看板 中描述的各种选项。
练习
添加默认分组。
使用合适的属性让房产默认按类型分组。你还必须禁止拖放。
可视化示例请参阅该节的 目标。
看板视图是一个典型的例子,说明从现有视图开始并对其进行微调,而不是从头开始,总是个好主意。可用的选项和类很多,所以……多读多学!