odoo开发教程八:qweb引擎
一:简介
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-xx或widget-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引擎的更多相关文章
- XAF应用开发教程(八) 汉化与多国语言支持
使用了XAF开发时,汉化是一个比较常的问题. 要实现汉化很简单: 1.在这里下载汉化资源文件.这里演示的版本是15.1.X的 2.文件下载后将:文件解压到目录 <你的项目>\BIN\ ...
- odoo 开发入门教程系列-QWeb简史
QWeb简史 到目前为止,我们的房地产模块的界面设计相当有限.构建列表视图很简单,因为只需要字段列表.表单视图也是如此:尽管使用了一些标记,如<group>或<page>,但在 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...
- 微信公众平台开发教程(八)Session处理
微信公众平台开发教程(八)Session处理 在微信窗口,输入的信息有限,我们需要将一些信息分多次请求. 比如:在进行用户绑定时,我们需要输入用户的相关信息,比如:用户名.密码,或者姓名.电话号码,服 ...
- 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示
原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...
- iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮
iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮 由于使用编辑界面添加视图的方式比较简单,所以不在介绍.这里,直接讲解代码中如何添加.使用代码为主视图添加一个按钮的方式和在1.3.3节 ...
- iOS 11开发教程(八)定制iOS11应用程序图标
iOS 11开发教程(八)定制iOS11应用程序图标 在图1.9中可以看到应用程序的图标是网状白色图像,它是iOS模拟器上的应用程序默认的图标.这个图标是可以进行改变的.以下就来实现在iOS模拟器上将 ...
- odoo开发安装插件教程小技巧
安装Odoo插件时而可能很繁琐且易于出现未知错误.当Odoo出现错误提示时.您需要深层次查询内核模块,安装其它依赖插件,下载全部插件,将它们放到恰当的部位,点安装,随后处理错误,然后再次测试,直至凡事 ...
- Cocos2d-x开发教程——《萝莉快跑》
更好的阅读体验请前往<萝莉快跑>开发教程. 配置:win7+Cocos2d-x.2.0.3+VS2012 目标读者:已经了解图形显示.动作.回调函数.定时器的用法. 一.基本知识点 1.动 ...
随机推荐
- linux环境下部署mysql环境
一.部署步骤 1.将安装包上传到Linux服务器上(目录随意),然后解压缩 2.进入到解压后的目录下,分别执行以下命令安装四个包(严格按照顺序执行) rpm -ivh mysql-community- ...
- springboot切换web服务器
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Docker常用软件安装
jdk dockere pull openjdk:11 docker run -d -t --name java-11 openjdk:11 MySQL 可以从docker hup中查找自己想要安装的 ...
- ChatGPT与码农的机会
之前一篇博客已经写了有关AI在博客编写方面的优势与对未来博客的编写方面的思考.这篇文档我继续分享一个我在开发中的一个案例和相关的感想. 事件还原 我发现ChatGPT也可以帮助我编写OData,于是我 ...
- 什么时候需要使用try-catch
代码执行预料不到的情况,或出错的可能性很大时,使用try-catch语句 构造一个文件输入流(上传文件时,线上环境的内存情况不确定)出错的可能性很大 文件上传写入, 数据库事务的提交,还有摄像头和打印 ...
- mysql的concat与concat_ws拼接字符串的使用
concat的使用 可以拼接多个字符 mysql> select concat(name,dept,job) from t1; +-----------------------+ | conca ...
- [MySQL]set autocommit=0与start transaction的区别[转载]
set autocommit=0指事务非自动提交,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务. 1.不管autocommit 是1还是 ...
- [数据分析与可视化] Python绘制数据地图2-GeoPandas地图可视化
本文主要介绍GeoPandas结合matplotlib实现地图的基础可视化.GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口.GeoPandas扩展了Pandas ...
- 进程,Process模块,join方法,ipc机制,守护进程
多道技术: """ 在学习并发编程的过程中 不做刻意提醒的情况下 默认一台计算机就一个CPU(只有一个干活的人) """ 单道技术 所有的程 ...
- DG修复:修改密码文件导致归档不应用
问题描述:重启完备库,之后发现主备同步状态异常,mrp进程状态显示applying log,但是v$datagaurd_stats视图中查询到归档日志并没有在应用.主库切换归档,可以正常传输过来,但是 ...