一:简介

QWeb是一个基于xml的模板引擎,用于生成HTML片段和页面,模板指令是写在xml标签中的以t-开头的属性,比如t-if
如果要让一个标签不被渲染,可以采用t来包裹,这样会执行它里面的命令但是不产生任何输出。【从这一点看,类似于jsp。】

template

创建一个QWeb视图,只需要一个arch元素并包含以下的属性:

  • id -- 视图的id
  • name, inherit_id, priority 与ir.ui.view的一致
  • primary -- 设置为True并与inherit_id一起使用时,设置为主视图
  • groups -- 以逗号分隔的分组id
  • page -- 设置为True时,该页面为网页
  • optional -- enabled 或 disabled,在用户界面中是否可以被禁用,默认是可以禁用

二:XML标签

1:输出内容

<p><t t-esc="要显示的内容"/></p>

2:条件语句:t-if属性值为True时,输出t标签包含内容

<div>
<t t-if="condition">
<p>ok</p>
</t>
</div> #当condition是true的时候解析成:
<div>
<p>ok</p>
</div> #condition为false的时候解析成
<div>
</div>

还有t-elif/t-else:

<div>
<p t-if="user.birthday == today()">Happy bithday!</p>
<p t-elif="user.login == 'root'">Welcome master!</p>
<p t-else="">Welcome!</p>
</div>

3:循环

t-foreach用来指定需要循环处理的数据,t-as提供的是在后面用于代表当前项目的变量名。

<t t-foreach="[1, 2, 3]" t-as="i">
<p><t t-esc="i"/></p>
</t>
#上述语句输出:
<p>1</p>
<p>2</p>
<p>3</p>

4:属性

qweb可以对属性进行实时计算并在输出时设置,通过t-attr来实现,有三种形式:

1)t-att-属性名 可以根据属性名创建一个属性:

<div t-att-a="42"/>  //创建属性a,属性值为42
#输出
<div a="42"></div>

属性值也可以为一个 格式化字符串,可以在运行期间确定具体值,作为属性值

<li t-attf-class="row {{ item_parity }}">//item_parity在运行时确定值

2)t-att=mapping 如果参数是映射表,每个键值对会生成一个属性:

<div t-att="{'a': 1, 'b': 2}"/>
#输出
<div a="1" b="2"></div>

3)t-att=pair 如果参数是元组或2个元素的数组,那么第一个项就作为属性名,第二个作为属性值:

<div t-att="['a', 'b']"/>
#输出
<div a="b"></div>

5:设置变量

使用t-set属性来实现变量声明,它的值就是设置的变量名。然后用t-value属性的属性值作为新变量的值。

<t t-set="foo" t-value="2 + 1"/>
<t t-esc="foo"/>
#输出3

6:调用子模板

<t t-call="other-template"/>会调用指定名字的模板

三:Python专用指令

1:格式化纪录

  • t-field只能用于格式化记录字段(从browe函数获取到的),可以根据字段类型自动匹配格式
  • t-options只能用于自定义字段,最常用的是widget,其他的选项都是field-xxwidget-xx

2:在controller中渲染模版

response = http.request.render('my-template', {
'context_value': 42
})
#会直接从controller里返回一个响应对象

3:在视图中渲染模版

ir.ui.view:中的render方法:

  • render(cr, uid, id[, values][, engine='ir.qweb][, context])
    通过view的数据库id来渲染一个qweb视图模板,模板在ir.ui.view记录会自动加载,它会为渲染环境设置一系列默认值

    • request - 当前WebRequest对象
    • debug - 当前请求是否是debug模式
    • quote_plus - 是否进行url encode转义
    • json - 相关的标准库
    • time - 相关的标准库
    • datetime - 相关的标准库
    • relativedelta - model的时间处理属性
    • keep_query - 一个keep_query函数,参数1:values-传递给qweb的上下文环境,参数2:engine (str) 用于qweb渲染的odoo模型名

四:JS专用指令

1:定义模板

<templates>
<t t-name="template-name">
<!-- template code -->
</t>
</templates>

2:继承模板

模板继承是用来修改已存在的模板,即给在其他模块定义的模板添加内容。

通过t-extend来表示,它的值是被继承的模板名,通过t-jquery来进行修改。

<t t-extend="base.template">
<t t-jquery="ul" t-operation="append">
<li>new element</li>
</t>
</t>

t-jquery是一个css选择器,用于选择需要改变的节点,并通过t-operation指定需要进行的操作

    • append - 新节点的内容添加到原节点的后面(最后一个子节点后)
    • prepend - 新节点内容添加到原节点前面(第一个子节点前)
    • before - 新节点内容添加到原节点前
    • after - 新节点内容添加到原节点后
    • inner - 新节点内容替换原节点的子节点replace - 新节点内容直接替换原节点
    • 如果没有指定operation,那么模板内容会被解析成javascript节点,并将context节点设置为this

五:调试指令

1:t-log

<t t-log="打印信息"/>

2:断点调试t-debug

<t t-if="condition">
<t t-debug="">
</t>

3:t-js

该节点内容里的javascript代码会在渲染时执行,接收一个context参数,将当前的环境传给js,从而可以使用context.XX调用上下文中的内容。

<t t-js="ctx">
console.log("var is", ctx.var);
</t>

odoo开发教程八:qweb引擎的更多相关文章

  1. XAF应用开发教程(八) 汉化与多国语言支持

    使用了XAF开发时,汉化是一个比较常的问题. 要实现汉化很简单: 1.在这里下载汉化资源文件.这里演示的版本是15.1.X的 2.文件下载后将:文件解压到目录    <你的项目>\BIN\ ...

  2. odoo 开发入门教程系列-QWeb简史

    QWeb简史 到目前为止,我们的房地产模块的界面设计相当有限.构建列表视图很简单,因为只需要字段列表.表单视图也是如此:尽管使用了一些标记,如<group>或<page>,但在 ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能

    在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  5. 微信公众平台开发教程(八)Session处理

    微信公众平台开发教程(八)Session处理 在微信窗口,输入的信息有限,我们需要将一些信息分多次请求. 比如:在进行用户绑定时,我们需要输入用户的相关信息,比如:用户名.密码,或者姓名.电话号码,服 ...

  6. 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

    原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...

  7. iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮

    iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮 由于使用编辑界面添加视图的方式比较简单,所以不在介绍.这里,直接讲解代码中如何添加.使用代码为主视图添加一个按钮的方式和在1.3.3节 ...

  8. iOS 11开发教程(八)定制iOS11应用程序图标

    iOS 11开发教程(八)定制iOS11应用程序图标 在图1.9中可以看到应用程序的图标是网状白色图像,它是iOS模拟器上的应用程序默认的图标.这个图标是可以进行改变的.以下就来实现在iOS模拟器上将 ...

  9. odoo开发安装插件教程小技巧

    安装Odoo插件时而可能很繁琐且易于出现未知错误.当Odoo出现错误提示时.您需要深层次查询内核模块,安装其它依赖插件,下载全部插件,将它们放到恰当的部位,点安装,随后处理错误,然后再次测试,直至凡事 ...

  10. Cocos2d-x开发教程——《萝莉快跑》

    更好的阅读体验请前往<萝莉快跑>开发教程. 配置:win7+Cocos2d-x.2.0.3+VS2012 目标读者:已经了解图形显示.动作.回调函数.定时器的用法. 一.基本知识点 1.动 ...

随机推荐

  1. 恰好经过k条边的最短路

    需要用到离散数学中关于关系矩阵的运算的知识 一个表示一个图中任意两点间经过2条边最短路的关系矩阵的平方表示的是任意两点间经过4条边的最短路的关系矩阵 原因在于当我们选定中间点时,路径的前半部分和后半部 ...

  2. 算法学习笔记(20): AC自动机

    AC自动机 前置知识: 字典树:可以参考我的另一篇文章 算法学习笔记(15): Trie(字典树) KMP:可以参考 KMP - Ricky2007,但是不理解KMP算法并不会对这个算法的理解产生影响 ...

  3. 部署kubernetes官网博客

    部署kubernetes官网博客 访问 https://kubernetes.io/ 有些时候不问题,部署离线内网使用官网以及博客, 各位尝鲜可以访问 https://doc.oiox.cn/ 安装d ...

  4. c/c++快乐算法第一天

    c/c++感受算法乐趣(1) 开始时间2023-04-14 18:31:47 结束时间2023-04-14 22:06:02 前言:经过两天的学习,是不是发现编程也挺简单的.其实不然,学好算法同时也是 ...

  5. Problems with EXC_BAD_ACCESS in CCBReader

    Hi guys, I've found problems using the CCBReader when deploying my game to an iPhone 4.There are sev ...

  6. Active Record Associations

    The Types of Associations 在 Rails 中,可以通过 ActiveRecord 来定义不同类型的关联关系(Associations),包括以下几种: belongs_to: ...

  7. DataX更换python3,File “datax.py“, line 114 print readerRef

    datax 报错 File "datax.py", line 114 print readerRef 报错: File "datax.py", line 114 ...

  8. Python_16 配置文件与封装

    一.查缺补漏 1. ctrl + alt +L 规范格式 2. Python 使用 ini&yaml 配置文件 http://testingpai.com/article/1621245437 ...

  9. 自动化部署(Gitlab)

    小程序可持续化自动部署 一.安装gitlab-runner 官方地址:https://docs.gitlab.com/runner/install/ windows安装如下: nodejs的环境变量一 ...

  10. mysql 结合python一些日常写法

    python sql语句in写法 sql = "SELECT * FROM user WHERE name in ({})".format(','.join(["'%s' ...