2009-05-29 4 views
0

J'essaie de trouver un moyen d'appeler des modèles de définition déterminés par les données disponibles dans le contexte.Comment appeler les defs de template avec des noms connus uniquement lors de l'exécution dans le langage de template Python Mako?

Modifier: Une instance plus simple de la même question.

Il est possible d'émettre la valeur d'un objet dans le contexte:

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

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

Produit:

I visit stackoverflow.com all the time. 

Je voudrais permettre une personnalisation de la sortie, sur la base des données.

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

Changer l'attribut format dans le contexte devrait changer la sortie de

I visit stackoverflow.com all the time. 

à

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

La composée syntaxe Je l'ai utilisé dans le bodydef est évidemment faux . De quoi aurais-je besoin pour spécifier dynamiquement un modèle, puis l'appeler?

+0

Pouvez-vous décrire ce que votre objectif est? De toute évidence, c'est compliqué - et il y a quelque chose que vous aimeriez accomplir qui pourrait être fait plus simplement. Quelle est la raison pour essayer cela? –

Répondre

1

prend un certain jeu avec l'espace de noms de Mako local, mais voici un exemple de travail:

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

Comme souhaité, cette émet:

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

C'est presque exactement ce que je cherchais. Remplacer local avec soi fonctionne bien avec les héritages aussi. – jamesh

0

Que diriez-vous si vous générez d'abord le modèle (à partir d'un autre modèle :), puis exécutez-le avec vos données?

Questions connexes