2009-05-29 11 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. 

Iデータに基づいて出力のカスタマイズを可能にしたいと思います。

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

私はbodydefで使用している作ら構文に

I visit stackoverflow.com all the time. 

からの出力を変更する必要がある状況でformat属性を変更する

# 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> 

は明らかに間違っています。動的にテンプレートを指定して呼び出す必要がありますか?

+0

あなたは、あなたの目標が何であるかを説明してもらえますか?明らかに、これは畳み込まれています。あなたが達成したいと思っているものがあります。これを試みる理由は何ですか? –

答えて

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

0

最初に(別のテンプレートから)テンプレートを生成し、それをあなたのデータで実行するとどうでしょうか?

関連する問題