Come posso chiamare le definizioni dei modelli con nomi conosciuti solo in fase di esecuzione nel linguaggio dei modelli Python Mako?
Domanda
Sto cercando di trovare un modo per chiamare modelli def determinati dai dati disponibili nel contesto.
Modificare: Un esempio più semplice della stessa domanda.
È possibile emettere il valore di un oggetto nel contesto:
# in python
ctx = Context(buffer, website='stackoverflow.com')
# in mako
<%def name="body()">
I visit ${website} all the time.
</%def>
Produce:
I visit stackoverflow.com all the time.
Vorrei consentire una personalizzazione dell'output, in base ai dati.
# 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>
Modificando il format
l'attributo nel contesto dovrebbe modificare l'output da
I visit stackoverflow.com all the time.
A
I visit <a href='http://stackoverflow.com'>stackoverflow.com</a> all the time.
IL sintassi inventata Ho usato in body
def
è ovviamente sbagliato.Di cosa avrei bisogno per specificare dinamicamente un modello e quindi chiamarlo?
Soluzione
Ci vuole un po' per giocare con i mako local
spazio dei nomi, ma ecco un esempio funzionante:
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()
Se desiderato, questo emette:
I visit
<a href='http://stackoverflow.com'>stackoverflow.com</a>
all the time.
Altri suggerimenti
Che ne dici se prima generi il modello (da un altro modello :) e poi lo esegui con i tuoi dati?