odoo10學習筆記八:qweb引擎


原文地址:http://www.cnblogs.com/ygj0930/p/7149497.html

一:簡介

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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM