* 概述
    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模板引擎的更多相关文章

  1. (21)odoo中的QWeb模板引擎

    -----------------更新时间18:13 2016-04-05 星期二-----------------* 概述    QWeb是odoo主要模板引擎,采用xml表述,最后生成HTML文件 ...

  2. 在express站点中使用ejs模板引擎

    在express站点中使用ejs模板引擎 文/玄魂 目录 在express站点中使用ejs模板引擎 前言 1.1         安装 1.2修改app.js 1.3创建测试页面 前言 使用 vs创建 ...

  3. .NET Core中使用Razor模板引擎

    一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...

  4. 【转】在Express项目中使用Handlebars模板引擎

    原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...

  5. nodejs+Express中使用mustache模板引擎

    由于公司一个seo项目,需要我协助.此项目他人已经开发大半,由于seo需要,使用了服务器端模板引擎.我项目的后端同事说项目是go语音写的,跑项目麻烦,只给了我template和css等静态文件. 为了 ...

  6. NodeJS中使用swig模板引擎

    NodeJS中的默认引擎是jade有点过于复杂,而且不是以HTML为基础的,学习成本和前端适应成本都很大.而ejs虽然简单,但不支持模板导入,而且效率一般. swig的语法简单,学习成本很低,符合常规 ...

  7. ThinkPHP3.2.3中使用smarty模板引擎循环

  8. WebApi中利用Razor模板引擎来生成html

    在服务器端基于Razor来生成html的一个思路 using System.Web.Mvc; using System.IO; using System.Web.Routing; using Syst ...

  9. Odoo中Qweb使用入门

    参考 可参考官网例子https://doc.odoo.com/trunk/web/qweb/或 http://thierry-godin.developpez.com/openerp/tutorial ...

随机推荐

  1. Java设计模式简单总结

    1.单例模式:在应用程序整个生命周期中,单例类的实例只有一个,并且会自动实例化.单例类的构造方法必须为私有,并且提供一个全局访问点 public class Test { private Test() ...

  2. 城里城外看SSDT

    引子 2006年,中国互联网上的斗争硝烟弥漫.这时的战场上,先前颇为流行的窗口挂钩.API挂钩.进程注入等技术已然成为昨日黄花,大有逐渐淡出之势:取而代之的,则是更狠毒.更为赤裸裸的词汇:驱动.隐藏进 ...

  3. adostoredproc用法 因为用的少每次还得看一下代码,记下来

    {1.关闭2.清除参数(固定的可省略)3.参数赋值4.打开(或执行)如果有感知控件的话 就会显示出结果} ADOStoredProc1.close; //关闭 ADOStoredProc1.param ...

  4. 转Git仓库分支(Branch)和标签(Tag)

    仓库的分支(Branch)规范,影响到每个团队的工作流的一致性:标签(Tag)便于开发团队.测 试团队和其他团队识别每个项目的版本,特别是在协同处理线上问题的时候,大家可以非常清楚 地知道线上运行版本 ...

  5. 22个Photoshop网页设计教程网站推荐

    这些网站都会经常更新一些优秀且高质量的Web界面设计教程.如果你热爱网页设计并且经常搜集各种界面设计教程,那么你一定要把下面这些网站收藏起来. 您还可以参考以下网页设计相关教程及资源:<Web ...

  6. windows域控导出hash

    #mimikaz导入域内所有hash mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.local /all /csv ...

  7. JS对象 字符串分割 split() 方法将字符串分割为字符串数组,并返回此数组。 语法: stringObject.split(separator,limit)

    字符串分割split() 知识讲解: split() 方法将字符串分割为字符串数组,并返回此数组. 语法: stringObject.split(separator,limit) 参数说明: 注意:如 ...

  8. Python学习笔记(五)——异常处理

    Python 异常总结 异常名称 解释 AssertionError 断言语句(assert)失败:当assert关键字后边的条件为假时,程序将抛出该异常,一般用于在代码中置入检查点 OSError ...

  9. Android开发 ImageView开发记录

    改变图片的着色 默认是这个方法 /** * 为图像设置着色选项. Assumes * {@link PorterDuff.Mode#SRC_ATOP} blending mode. * * @para ...

  10. 关于 argc 和 argv

    https://stackoverflow.com/questions/3898021/regarding-mainint-argc-char-argv 当使用命令行启动程序,或者给程序传输参数时,可 ...