2011-03-17 85 views
3

我無法理解變色龍的標籤。我是django的用戶,但決定將我的CompSci課程隊友和我自己介紹給金字塔,因爲我雖然更輕便=易於學習。Python Pyramid&Chameleon模板語言轉義html

目前,$ {}標記正在轉義任何我試圖通過它輸出的html標記。在Django中,有一些方法可以指定一個變量是「安全的」,不需要轉義。

我怎樣才能在金字塔/變色龍做同樣的事情?

回答

9

變色龍基於Zope Page Templates庫,所以如果您發現變色龍文檔缺乏,您可能希望查看zpt文檔。

無論如何,有兩種主要的方法可以做到這一點。如果使用tal:replace或tal:content標記屬性進行渲染,則可以使用"structure"。這是通過將structure放在字符串的開頭,然後是空格,最後是要呈現的模板變量的名稱來完成的。一個例子如下:

s = ''' 
<html> 
    <head> 
    </head> 
    <body> 
     <div tal:content="structure t"> 
     </div> 
    </body> 
</html> 
''' 

from chameleon import PageTemplate 

pt = PageTemplate(s) 

print pt(t='<p>Hi!</p>') 

如果你不想使用TAL:更換或TAL:內容功能,你需要用你的字符串中的另一個目的是,變色龍渲染器將不會試圖逃跑(這意味着它有一個返回字符串應該是的__html__方法)。通常情況下,這意味着創建一個'文字'類如下所示:

a = ''' 
<html> 
    <head> 
    </head> 
    <body> 
     <div> 
      ${t} 
     </div> 
    </body> 
</html> 
''' 

from chameleon import PageTemplate 

pt = PageTemplate(a) 

class Literal(object): 
    def __init__(self, s): 
     self.s =s 

    def __html__(self): 
     return self.s 

print pt(t=Literal('<p>Hi!</p>')) 
+0

謝謝。文字的第二個解決方案非常優雅。 – rdrey 2011-03-19 12:14:13

+1

jules下面的解決方案似乎是最直接的。 – GuyNoir 2013-05-21 05:15:39

14

變色龍還允許$ {structure:markup}。

+0

這就是我來到的原因 – 2013-12-20 17:48:30

+1

因爲我不清楚(也許是因爲我是Chameleon的新手):關鍵字是'structure:'。我試圖使用'$ {myVar:markup}',並且因錯誤消息而丟失了一些信息。 – tsauerwein 2014-06-13 09:19:46