2009-05-29 53 views
0

我想找到一種方法來調用由上下文中可用的數據確定的def模板。如何在Python模板語言Mako中使用僅在運行時已知的名稱調用模板定義?

編輯:一個簡單的同一個問題的實例。

,能夠發出在上下文對象的值:

# in python 
ctx = Context(buffer, website='stackoverflow.com') 

# in mako 
<%def name="body()"> 
I visit ${website} all the time. 
</%def> 

產地:

I visit stackoverflow.com all the time. 

我想允許的輸出的定製,基於該數據。

# in python 
ctx = Context(buffer, website='stackoverflow.com', format='text') 

# in mako 
<%def name="body()"> 
I visit ${(format + '_link')(website)} all the time. <-- Made up syntax. 
</%def> 

<%def name='html_link(w)'> 
<a href='http://${w}'>${w}</a> 
</%def> 

<%def name='text_link(w)'> 
${w} 
</%def> 

改變的背景下format屬性應該輸出從

I visit stackoverflow.com all the time. 

改變

I visit <a href='http://stackoverflow.com'>stackoverflow.com</a> all the time. 

由語法我在bodydef使用顯然是錯誤的。我需要什麼來動態指定一個模板,然後調用它?

+0

你能描述你的目標是什麼?很明顯,這是令人費解的 - 並且有一些你想要完成的事情可能會更簡單。這是什麼原因呢? – 2009-05-29 02:25:42

回答

1

需要一些上場與灰鯖鯊的local命名空間,但這裏有一個工作示例:

from mako.template import Template 
from mako.runtime import Context 
from StringIO import StringIO 

mytemplate = Template(""" 
<%def name='html_link(w)'> 
<a href='http://${w}'>${w}</a> 
</%def> 
<%def name='text_link(w)'> 
${w} 
</%def> 
<%def name="body()"> 
I visit ${getattr(local, format + '_link')(website)} all the time. 
</%def> 
""") 

buf = StringIO() 
ctx = Context(buf, website='stackoverflow.com', format='html') 
mytemplate.render_context(ctx) 
print buf.getvalue() 

如期望的那樣,它會產生:

I visit 
<a href='http://stackoverflow.com'>stackoverflow.com</a> 
all the time. 
+0

這幾乎正是我所期待的。用自己替代本地也能很好地繼承。 – jamesh 2009-06-02 11:13:18

0

如果您首先生成模板(來自另一個模板:),然後使用您的數據運行該模板,那麼該怎麼辦?

相關問題