odoo中的QWeb模板引擎
* 概述
QWeb是odoo主要模板引擎,采用xml表述,最后生成HTML文件
* 一般用法
#条件表达式
<t t-if="record.effort_estimate.raw_value > 0">
<li>Estimate <field name="effort_estimate"/></li>
</t>
比较符号:
lt(<) lte(<=) gt(>) gte(>=)
注 < <= 不能用在表达式中,只能用字母代替
# 输出值 t-esc 和 t-raw
<t t-esc="record.message_follower_ids.raw_value" />
<t t-raw="record.message_follower_ids.raw_value" />
t-esc 过滤安全值,像html元素
t-raw 数据库中的原始数据
# 循环
<t t-foreach="record.message_follower_ids.raw_value" t-as="rec">
<t t-esc="rec" />;
</t>
t-foreach="record.message_follower_ids.raw_value.slice(0, 3)" 还可以切片
还有一些变量
rec_index 从0开始循环索引
rec_size 要循环的记录集大小
rec_first 第一个元素
rec_last 最后一个元素
rec_even index为偶数时为真
rec_odd index为奇数时为真
rec_parity 是偶数和奇数
rec_all 表示循环结束的标识
rec_value 循环一个字典时,的键的值
# 动态属性
<div>
<t t-foreach="record.message_follower_ids.raw_value.slice(0, 3)"
t-as="rec">
<img t-att-src="kanban_image(
'res.partner', 'image_small', rec)"
class="oe_kanban_image oe_kanban_avatar_smallbox"/>
</t>
</div
t-att- prefixed 如 <img>的src 就可以 t-att-src="..."
# 属性的字符替换
<span t-attf-class="oe_kanban_text{{
record.date_deadline.raw_value and
!(record.date_deadline.raw_value > (new Date()))
? '_red' : '_black' }}">
<field name="date_deadline"/>
</span>
t-attf-prefixed 取代内容,上面的就是动态类
# 变量设置
#设置变量 t-set t-value
<t t-set="new_variable" t-value="True" />
设置了变量 new_variable 的值 为 True
t-value 也可以是表达
<t t-set="foo" t-value="2+1" >
设置了变量foo值为3
t-value可以是一段html
<t t-set="foo">
<li>ok</li>
</t>
设置了变量foo 为 <li>ok</li>
#设置属性
t-att-$name
$name 是属性名
<div t-att-a="66" />
结果:
<div a="66"></div>
t-attf-$name 用于混合,有字符串也有变量,变量用{{}}
<t t-foreach="[1, 2, 3]" t-as="item">
<li t-attf-class="row {{ item_parity }}"><t t-esc="item"/></li>
</t>
t-att=mapping 键值对组成属性,主要用多对
<div t-at="{'a':1,'b':2}" />
结果:
<div a="1" b="2"></div>
t-att=pair 一对,这个对一个是键,后一个是值
<div t-att="['a','b']" /> <=> <div t-att="('a','b')" />
结果:
<div a="b"></div>
# 包含其它模板
<t t-name="follower_avatars">
<div>
<t t-foreach="record.message_follower_ids.raw_value.slice(0, 3)"
t-as="rec">
<img t-att-src="kanban_image(
'res.partner', 'image_small', rec)"
class="oe_kanban_image oe_kanban_avatar_smallbox"/>
</t>
</div>
</t>
。。。
<t t-call='follower_avatars' />
t-call 调用其它模板
复用灵活一些
<t t-name="follower_avatars">
<div>
<t t-foreach="record.message_follower_ids.raw_value.slice(0, arg_max)"
t-as="rec">
<img t-att-src="kanban_image(
'res.partner', 'image_small', rec)"
class="oe_kanban_image oe_kanban_avatar_smallbox"/>
</t>
</div>
</t>
。。。
<t t-call='follower_avatars'>
<t t-set="arg_max" t-value='3' /> <t/>
# QWeb 其它指令
<p t-att="{'class': 'oe_bold', 'name': 'test1'}" />
结果显示
<p class="oe_bold" name="test1" />
t-att 接受字典
<p t-att="['class','oe_bold']"
结果显示
<p class="oe_bold">
# card类式加菜单
<div class="oe_dropdown_kanban oe_dropdown_toggle">
<span class="oe_e">í</span>
<ul class="oe_dropdown_menu">
<t t-if="widget.view.is_action_enabled('edit')">
<li>
<a type="edit">Edit...</a>
</li>
</t>
<t t-if="widget.view.is_action_enabled('delete')">
<li>
<a type="delete">Delete</a>
</li>
</t>
<!-- Color picker option: -->
<li>
<ul class="oe_kanban_colorpicker"
data-field="color"/>
</li>
</ul>
</div>
# card类式加颜色
<field name="color" />
<div class="oe_kanban_card">
<div t-attf-class="oe_kanban_card
#{kanban_color(record.color.raw_value)}">
# 为长文本加省略号
<t t-esc="kanban_text_ellipsis(record.name.value, 32)" />
过超32个字符就加... 不显示内容了
# 自定义css 和javascript的资源
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="assets_backend"
inherit_id="web.assets_backend"
name="Todo Kanban Assets">
<xpath expr="." position="inside">
<link rel="stylesheet"
href="/todo_kanban/static/src/css/todo_kanban.css"
/>
<script type="text/javascript"
src="/todo_kanban/static/src/js/todo_kanban.js">
</script>
</xpath>
</template>
</data>
</openerp>
# 调用其它模板
采用t-call
<template id="sub">
<t t-esc="identifier" />
</template>
<template id="hello">
<p>
hello,
<t t-call="module.sub">
<t t-set="identifier" t-value="name" />
</t>
</p>
</template>
#字段渲染
@http.route('hello/<model("res.users"):user') # 给用户的id即可
def hello(self,user,**kw)
return http.request.render('module.hello',{'user':user})
-------
<template id="hello">
<p t-field="user.display_name" />
</template>
---------
#可用字段选择修饰
<template id="hello">
<p t-field="user.creat_date" />
<p t-field="user.creat_date" t-filed-options='{"format":"long"}'/>
<p t-field="user.creat_date" t-filed-options='{"format":"EEE"}'/>
</template>
-------------
<template id="hello">
<p t-field="user.wealth" />
<p t-field="user.wealth" t-filed-options='{
"widget":"monetary"
"display_currency":"user.company_id.currency_id"
}'/>
</template>
------------
<template id="hello">
<p t-field="user.create_date" t-field-options='{"widget":relative}}' />
</template>
#模板继承
<template id="hello">
<p> Base template </p>
</template>
<template id="hello2" inherit_id="hello" name="Extender">
<xpath expr="//p" position="before">
<h1>Extended!</h1>
</xpath>
</template>
得到的结果:
<h1>Extended!</h1>
<p>Base template</p>
--------------
<template id="hello">
<p class="a">A</p>
<p class="b">B</p>
</template>
<template id="hello2" inherit_id="hello" name="Extender">
<xpath expr="//p[hasclass('b')]" position="before">
<h1>Extended!</h1>
</xpath>
</template>
得到的结果:
<p class="a">A</p>
<h1>Extended!</h1>
<p class="b">B</p>
----------
调用系统的基础模板:
<template id="hello">
<t t-call="website.layout">
<p class="a">A</p>
<p class="b">B</p>
</t>
</template>
<template id="hello2" inherit_id="hello" name="Extender">
<xpath expr="//p[hasclass('b')]" position="before">
<h1>Extended!</h1>
</xpath>
</template>
#调试
t-debug
<t t-debug="pdb" />
<=>
importlib.import_module("pdb").set_trace()
#python的请求模板
response = http.request.render('my-template',{'context_value':99})
用得是 http.request.render()方法
*代码分析
#扫描枪的操作界面
<openerp>
<data>
<template id="assets_backend" name="stock assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/stock/static/src/css/stock.css"/>
<script type="text/javascript" src="/stock/static/src/js/widgets.js"></script>
</xpath>
</template>
.....
</data>
<openerp>
odoo中的QWeb模板引擎的更多相关文章
- (21)odoo中的QWeb模板引擎
-----------------更新时间18:13 2016-04-05 星期二-----------------* 概述 QWeb是odoo主要模板引擎,采用xml表述,最后生成HTML文件 ...
- 在express站点中使用ejs模板引擎
在express站点中使用ejs模板引擎 文/玄魂 目录 在express站点中使用ejs模板引擎 前言 1.1 安装 1.2修改app.js 1.3创建测试页面 前言 使用 vs创建 ...
- .NET Core中使用Razor模板引擎
一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...
- 【转】在Express项目中使用Handlebars模板引擎
原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...
- nodejs+Express中使用mustache模板引擎
由于公司一个seo项目,需要我协助.此项目他人已经开发大半,由于seo需要,使用了服务器端模板引擎.我项目的后端同事说项目是go语音写的,跑项目麻烦,只给了我template和css等静态文件. 为了 ...
- NodeJS中使用swig模板引擎
NodeJS中的默认引擎是jade有点过于复杂,而且不是以HTML为基础的,学习成本和前端适应成本都很大.而ejs虽然简单,但不支持模板导入,而且效率一般. swig的语法简单,学习成本很低,符合常规 ...
- ThinkPHP3.2.3中使用smarty模板引擎循环
- WebApi中利用Razor模板引擎来生成html
在服务器端基于Razor来生成html的一个思路 using System.Web.Mvc; using System.IO; using System.Web.Routing; using Syst ...
- Odoo中Qweb使用入门
参考 可参考官网例子https://doc.odoo.com/trunk/web/qweb/或 http://thierry-godin.developpez.com/openerp/tutorial ...
随机推荐
- 堡垒机介绍及实现 (使用python django实现)(一)
堡垒机介绍及实现 (使用python django实现)(一) 堡垒机的功能 我们在使用服务器的时候,通常的方式是 ssh user@ip 然后输入password 多人同时使用,就需要多个账号.这时 ...
- GPIO, AFIO
o read/write the AFIO_EVCR, AFIO_MAPR and AFIO_EXTICRX registers, the AFIO clock should first be ena ...
- BBB 常用指令
source .bashrc root@beaglebone:~# route add default gw 192.168.7.1 echo BB-SPIDEV0 > /sys/devices ...
- npm -v 报错:cannot find module 'core-util-is'
今天想打开之前的项目运行看看,结果报错:cannot find module 'core-util-is',以为只是缺少模块core-util-is,然后npm install --save core ...
- Pod 私有仓库构建
Pod 私有仓库构建 创建`私有仓库索引库`(iOS) 添加`私有仓库索引库`到本地repo管理 创建自己的`组建库工程 上传`组建库工程`到`私有仓库索引库` App工程调用`组建库工程` 目的 私 ...
- JS对象 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
返回指定的字符串首次出现的位置 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(substring, startpos) 参 ...
- MySQL入门基础知识
1.MySQL环境变量的配置 操作数据库时,要进入bin目录,如下: 但是如果进行配置环境变量,就不必切换路径,如下图所示,即使没有在G:\mysql-8.0.16-winx64\bin下,数据库依然 ...
- 从别人git下载项目下来然后运行
1点击clone or download 2.自由选择 3.拉到你想放的位置,我是放到桌面上的 4. cmd 打开,进入你 的下载到桌面的项目 5. # install dependencies n ...
- vue v-show指令
demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- P5390 [Cnoi2019]数学作业
P5390 [Cnoi2019]数学作业求子集异或和的和拆成2进制,假设有x个数这一位为1,剩下n-x个数对答案没有贡献,对于这一位而言,对答案的贡献就是,x个数选奇数个数的方案数*2^(n-x).由 ...