Come posso chiamare le definizioni dei modelli con nomi conosciuti solo in fase di esecuzione nel linguaggio dei modelli Python Mako?

StackOverflow https://stackoverflow.com/questions/923837

  •  06-09-2019
  •  | 
  •  

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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top