2009-05-29 3 views
0

Ich versuche, einen Weg zu rufen def Vorlagen durch die Daten im Kontext bestimmt zu finden.Wie rufe ich Vorlage defs mit Namen nur zur Laufzeit in der Sprache Python-Vorlage bekannt Mako?

Bearbeiten: Eine einfachere Instanz der gleichen Frage.

Es ist möglich, den Wert eines Objekts im Kontext zu emittieren:

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

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

Produziert:

I visit stackoverflow.com all the time. 

Ich möchte eine Anpassung der Ausgabe ermöglichen, auf der Grundlage der Daten.

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

das format Attribut im Kontext ändern sollte die Ausgabe von

I visit stackoverflow.com all the time. 

zu

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

Die aus Syntax ändern ich in der bodydef verwendet haben, ist offensichtlich falsch . Was würde ich benötigen, um eine Vorlage dynamisch anzugeben und sie dann aufzurufen?

+0

Können Sie beschreiben, was Ihr Ziel ist? Klar, das ist verschachtelt - und es gibt etwas, das Sie gerne erledigen würden, das könnte einfacher gemacht werden. Was ist der Grund dafür? –

Antwort

1

nimmt einige Spiel mit local Namensraum mako, aber hier ist ein funktionierendes Beispiel:

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() 

Wie gewünscht, diese emittiert:

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

Das ist fast genau das, wonach ich gesucht habe. Das Ersetzen von local mit self funktioniert auch gut mit Erben. – jamesh

0

Wie wäre es, wenn Sie zuerst die Vorlage generieren (aus einer anderen Vorlage :), und führen Sie das mit Ihren Daten?

Verwandte Themen