2013-10-10 3 views
1

У меня есть большой набор сообщений, характерных для одной страницы, из которых я мог бы ночью показать любую комбинацию. Чтобы упростить добавление новых сообщений (большое количество в ближайшее время станет еще больше), и чтобы предотвратить наличие гигантского блока if/elif с записью для каждого из них, мне нужен способ включить все соответствующие шаблоны без необходимо обновить шаблон каждый раз, когда добавлено новое сообщение. Мой, хотя был для dict, представляющий сообщение, чтобы включить его шаблон. Это была моей попытка сделать так:Динамический набор шаблонов Мако для включения другого шаблона

<div class="item-content" id="results_content"> 
    <ul class="unstyled"> 
    %for msg in c.page_messages: 
     <%include file="${msg.get('template_path')}" args="message=msg"/> 
    %endfor 
    </ul> 
</div> 

Это приводит к ошибке в% включает тег:

TypeError: 'NoneType' object has no attribute '__getitem__' 
  1. Может ли быть подтвержден, могу ли я использовать переменный шаблон включаемый тег , Я не могу найти ничего конкретного, заявляя в любом случае, если я должен ожидать, что это сработает.
  2. Если это не то, что будет работать, есть ли другой способ, которым я могу выполнить одно и то же? т.е. - можно добавить новое сообщение, не изменяя этот код шаблона, который тянет в каждом шаблоне сообщений.

ответ

4

Похоже, вы можете использовать переменные в теге include так, как вы описываете. From the docs:

All tags have a set of attributes which are defined for each tag. Some of these attributes 
are required. Also, many attributes support evaluation, meaning you can embed an  
expression (using ${}) inside the attribute text: 

<%include file="/foo/bar/${myfile}.txt"/> 

Я думаю, что c.page_messages не итератор словарей в этой точке.

Смежные вопросы