Как мне вызвать определения шаблонов с именами, известными только во время выполнения, на языке шаблонов Python Mako?

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

  •  06-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь найти способ вызова шаблонов 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 это явно неправильно.Что мне нужно, чтобы динамически указать шаблон, а затем вызвать его?

Это было полезно?

Решение

Нужно немного поиграть с мако. 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.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top