QWeb是Odoo2使用的主要模板引擎。 它是一個XML模板引擎1,主要用於生成HTML片斷和頁面。javascript
模板指令被指定爲前綴爲t-
的XML屬性,例如t-if
for conditionals,其中元素和其餘屬性直接呈現。java
爲了不元素呈現,佔位符元素<t>
也可用,它執行其指令但不會生成任何輸出:node
<t t-if="condition"> <p>Test</p> </t>
將致使:python
<p>Test</p>
若是condition
爲真,可是:jquery
<div t-if="condition"> <p>Test</p> </div>
將致使:web
<div> <p>Test</p> </div>
QWeb有一個主輸出指令,當顯示用戶提供的內容時,它會自動HTML轉義其限制XSS風險的內容:esc
。數據庫
esc
接受表達式,對其進行評估並打印內容:json
<p><t t-esc="value"/></p>
使用設置爲42的值value
進行渲染:api
<p>42</p>
還有另外一個輸出指令raw
,其行爲與esc
相同,但不對其輸出進行HTML轉義。 顯示單獨構造的標記(例如,來自功能)或已經消毒的用戶提供的標記多是有用的。數組
QWeb有一個條件指令if,它用於計算做爲屬性值給出的表達式:
<div> <t t-if="condition"> <p>ok</p> </t> </div>
若是條件爲真,則呈現元素:
<div> <p>ok</p> </div>
但若是條件爲false,則從結果中刪除:
<div> </div>
條件呈現適用於指令的承載,沒必要是<t>
:
<div> <p t-if="condition">ok</p> </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>
QWeb有一個迭代指令foreach,它接受一個返回集合的表達式迭代,第二個參數t-提供用於迭代「當前項」的名稱:
<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>
與條件相似,foreach適用於帶有指令屬性的元素,和
<p t-foreach="[1, 2, 3]" t-as="i"> <t t-esc="i"/> </p>
等同於前面的例子。
foreach
能夠迭代一個數組(當前項將是當前值),一個映射(當前項將是當前鍵)或一個整數(至關於在0和0之間的數組上迭代和提供的整數不包括)。
除了經過t-as
傳遞的名稱以外,foreach
還爲各類數據點提供了一些其餘變量:
警告
$as
將被傳遞給t-as
的名稱替換
迭代的對象
當前迭代值,與$as和列表和整數相同,但對於映射,它提供值(其中$ as提供鍵)
當前迭代索引(迭代的第一項索引爲0)
集合的大小(若是可用)
當前項是不是迭代的第一個(至關於$as_index==0)
當前項是不是迭代的最後一項(至關於$as_index + 1 == $as_size),要求iteratee的大小可用
「偶數」或「奇數」,當前迭代輪次的奇偶校驗
一個布爾標誌,指示當前迭代輪次在偶數索引上
一個布爾標誌,指示當前迭代輪次在奇數索引上
提供的這些額外變量和建立到foreach
中的全部新變量僅在foreach
的範圍內可用。 若是變量存在於foreach
的上下文以外,則該值將在foreach的末尾複製到全局上下文中。
<t t-set="existing_variable" t-value="False"/> <!-- existing_variable now False --> <p t-foreach="[1, 2, 3]" t-as="i"> <t t-set="existing_variable" t-value="True"/> <t t-set="new_variable" t-value="True"/> <!-- existing_variable and new_variable now True --> </p> <!-- existing_variable always True --> <!-- new_variable undefined -->
QWeb能夠即時計算屬性並在輸出節點上設置計算結果。 這是經過t-att
(屬性)指令完成的,該指令以3種不一樣的形式存在:
建立名爲$name
的屬性,計算屬性值並將結果設置爲屬性的值:
<div t-att-a="42"/>
將呈現爲:
<div a="42"></div>
與以前相同,但參數是格式字符串而不只僅是表達式,一般用於混合文字和非文字字符串(例如類):
<t t-foreach="[1, 2, 3]" t-as="item"> <li t-attf-class="row {{ item_parity }}"><t t-esc="item"/></li> </t>
將呈現爲:
<li class="row even">1</li> <li class="row odd">2</li> <li class="row even">3</li>
若是參數是映射,則每一個(鍵,值)對生成一個新屬性及其值:
<div t-att="{'a': 1, 'b': 2}"/>
將呈現爲:
<div a="1" b="2"></div>
若是參數是一對(元組或2元素的數組),則該對的第一項是屬性的名稱,第二項是值:
<div t-att="['a', 'b']"/>
將呈現爲:
<div a="b"></div>
QWeb容許在模板中建立變量,記憶計算(屢次使用它),爲一段數據提供更清晰的名稱,......
這是經過set
指令完成的,該指令採用要建立的變量的名稱。 要設置的值能夠經過兩種方式提供:
<t t-set="foo" t-value="2 + 1"/> <t t-esc="foo"/>
將打印3
若是沒有t-value
屬性,則呈現節點的主體並將其設置爲變量的值:
<t t-set="foo"> <li>ok</li> </t> <t t-esc="foo"/>
將生成&lt; li&gt; ok&lt; / li&gt;
(內容在咱們使用esc
指令時被轉義)
使用此操做的結果是
raw
指令的重要用例。
QWeb模板可用於頂級渲染,但也可使用t-call
指令從另外一個模板中使用它們(以免重複或爲模板的某些部分命名):
<t t-call="other-template"/>
若是other_template
定義爲:這將使用父項的執行上下文調用命名模板:
<p><t t-value="var"/></p>
上面的調用將呈現爲
(無內容),可是:<t t-set="var" t-value="1"/> <t t-call="other-template"/>
將呈現爲<p> 1 </p>
。
然而,這具備從t-call
外部可見的問題。 或者,將在調用子模板以前評估在call
指令體中設置的內容,而且能夠更改本地上下文:
然而,這具備從t-call外部可見的問題。 或者,將在調用子模板以前評估在call
指令體中設置的內容,而且能夠更改本地上下文:
<t t-call="other-template"> <t t-set="var" t-value="1"/> </t> <!-- "var" does not exist here -->
call
指令的主體能夠是任意複雜的(不只僅是set
指令),它的渲染形式在被調用的模板中可用做一個神奇的0
變量:
<div> This template was called with content: <t t-raw="0"/> </div>
被稱爲:
<t t-call="other-template"> <em>content</em> </t>
將致使:
<div> This template was called with content: <em>content</em> </div>
只有在「智能」記錄(browse
方法的結果)上執行字段訪問(a.b
)時,才能使用t-field指令。 它可以根據字段類型自動格式化,並集成在網站的富文本版本中。
t-options
可用於自定義字段,最多見的選項是widget
,其餘選項依賴於字段或窗口小部件。
使用PDB的set_trace
API調用調試器。 參數應該是模塊的名稱,在該模塊上調用set_trace
方法:
至關於importlib.import_module(「pdb」)。set_trace()
QWeb的大多數Python端用途都在控制器中(以及在HTTP請求期間),在這種狀況下,經過調用odoo.http.HttpRequest.render()
能夠輕鬆地呈現存儲在數據庫中的模板(做爲視圖):
response = http.request.render('my-template', { 'context_value': 42 })
這會自動建立一個Response對象,該對象能夠從控制器返回(或進一步自定義以適應)。
比前一個幫助器更深層次的是ir.ui.view
上的render
方法:
render(cr, uid, id[, values][, engine='ir.qweb][, context])
按數據庫ID或外部ID呈現QWeb視圖/模板。 模板從ir.ui.view
記錄自動加載。
在渲染上下文中設置許多默認值:
request
當前的WebRequest
對象,若是有的話
debug
當前請求(若是有)是否處於調試模式
quote_plus
url編碼實用程序功能
json
相應的標準庫模塊
time
相應的標準庫模塊
datetime
相應的標準庫模塊
參考模塊
keep_query
keep_query
幫助函數
Parameters:values -- 要傳遞給QWeb進行渲染的上下文值
engine(str
)-- 用於渲染的Odoo模型的名稱,可用於在本地擴展或自定義QWeb(經過建立基於帶有更改的ir.qweb
的「新」qweb)
t-name
指令只能放在模板文件的頂層(將子項指向文檔根目錄):
<templates> <t t-name="template-name"> <!-- template code --> </t> </templates>
它不須要其餘參數,但能夠與<t>
元素或任何其餘元素一塊兒使用。 使用<t>
元素,<t>
應該只有一個子元素。
模板名稱是任意字符串,可是當多個模板相關時(例如,稱爲子模板),一般使用點分隔名稱來指示層次關係。
模板繼承用於就地改變現有模板,例如, 向其餘模塊建立的模板添加信息。
模板繼承經過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
節點的主體用於替換上下文節點自己
若是沒有指定t-operation,模板體將被解釋爲javascript代碼,並以上下文節點做爲this
的形式執行
警告
雖然比其餘操做更強大,但這種模式也很難調試和維護,建議避免使用它
javascript QWeb實現提供了一些調試鉤子:
獲取表達式參數,在呈現期間計算表達式並使用console.log記錄其結果:
<t t-set="foo" t-value="42"/> <t t-log="foo"/>
將打印42
到控制檯
在模板呈現期間觸發調試器斷點:
<t t-if="a_test"> <t t-debug=""> </t>
若是調試處於活動狀態,則會中止執行(具體狀況取決於瀏覽器及其開發工具)
節點的主體是在模板渲染期間執行的javascript代碼。 採用context
參數,該參數是t-js
主體中渲染上下文可用的名稱
<t t-set="foo" t-value="42"/> <t t-js="ctx"> console.log("Foo is", ctx.foo); </t>
core.qweb
(core是web.core
模塊)QWeb2.Engine()
的一個實例,其中加載了全部模塊定義的模板文件,並引用了標準輔助對象_
(下劃線),_ t
(轉換函數)和JSON。
core.qweb.render
可用於輕鬆呈現基本模塊模板
class QWeb2.Engine()
QWeb「渲染器」處理QWeb的大部分邏輯(加載,解析,編譯和渲染模板)。
OpenERP Web爲核心模塊中的用戶實例化一個,並將其導出到core.qweb
。 它還將各類模塊的全部模板文件加載到該QWeb實例中。
QWeb2.Engine()也可用做「模板命名空間」。
QWeb2.Engine.render(template[, context])
使用context
(若是提供)將先前加載的模板呈現給String,以查找在模板呈現期間訪問的變量(例如,要顯示的字符串)。
Arguments:
template(String
)-- 要呈現的模板的名稱
context (Object)-- 用於模板渲染的基本命名空間
Returns:String
引擎公開了另外一種在某些狀況下可能有用的方法(例如,若是你須要一個單獨的模板命名空間,在OpenERP Web中,看板視圖能夠獲得他們本身的QWeb2.Engine()
實例,這樣他們的模板就不會與更通常的碰撞「 模塊「模板」:
QWeb2.Engine.add_template(templates)
在QWeb實例中加載模板文件(模板集合)。 模板能夠指定爲:
QWeb將嘗試將其解析爲XML文檔,而後加載它。
QWeb將嘗試下載URL內容,而後加載生成的XML字符串。
Document
or Node
QWeb將遍歷文檔的第一級(提供的根的子節點)並加載任何命名的模板或模板覆蓋。
QWeb2.Engine()
還公開了行爲定製的各類屬性:
QWeb2.Engine.prefix
用於在解析期間識別指令的前綴。 一個字符串。 默認狀況下,t
。
QWeb2.Engine.debug
將引擎置於「調試模式」的布爾標誌。 一般,QWeb會攔截模板執行期間引起的任何錯誤。 在調試模式下,它會在不攔截全部異常的狀況下經過。
QWeb2.Engine.jQuery
模板繼承處理期間使用的jQuery實例。 默認爲window.jQuery
。
QWeb2.Engine.preprocess_node
一個功能。 若是存在,則在將每一個DOM節點編譯爲模板代碼以前調用。 在OpenERP Web中,這用於自動翻譯模板中的文本內容和一些屬性。 默認爲null
。