Как я могу вызвать определение шаблона с именами, известными только во время выполнения на языке шаблонов Python Mako? - PullRequest
0 голосов
/ 29 мая 2009

Я пытаюсь найти способ вызова шаблонов def, определяемых данными, доступными в контексте.

Редактировать: Более простой пример того же вопроса.

Можно указать значение объекта в контексте:

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

Я хотел бы разрешить настройку вывода на основе данных.

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

Изменение атрибута format в контексте должно изменить вывод с

I visit stackoverflow.com all the time.

до

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

Составленный синтаксис , который я использовал в body def, явно неверен. Что мне нужно, чтобы динамически указать шаблон, а затем вызвать его?

Ответы [ 2 ]

1 голос
/ 30 мая 2009

Немного поиграется с пространством имен 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 голосов
/ 29 мая 2009

А если вы сначала сгенерируете шаблон (из другого шаблона :), а затем запустите его со своими данными?

...