Блокировать теги в turbogears/genshi (py:match)?

Хорошо, я пришел из Django, поэтому, пожалуйста, извините меня, если то, что я пишу, не имеет смысла. Я пытаюсь «переопределить» часть моего мастер-шаблона в турборедукторах, используя genshi. До сих пор я безуспешно пробовал только директиву py:match:

основной шаблон:

<div id="menu">
    <div class="menu-items" py:match="topmenu" py:attrs="select('@*')">
        ${select('*')}
    </div>
</div>

дочерний шаблон:

<topmenu> <span> HELLO! </span> </topmenu>

Это выводит <span> HELLO! </span> за пределы div меню. Что я делаю неправильно?


person Ruben Quinones    schedule 05.01.2012    source источник


Ответы (1)


Genshi py:match немного сложно понять. Документация TurboGears2 довольно хорошо объясняет эту концепцию: "данное выражение XPath находит и заменяет каждый элемент в шаблоне, который соответствует выражению, содержимым элемента, содержащего py:match."

Это означает, что фактически элемент, у которого есть py:match, заменяет тот, у которого его нет. Поэтому, если вы хотите поместить меню в мастер из дочернего шаблона, вы должны инвертировать два:

МАСТЕР:

<body py:match="body" py:attrs="select('@*')">
    <topmenu id="menu-items"></topmenu>
</body>

РЕБЕНОК:

<body>
    <div py:match="topmenu" py:attrs="select('@*')"><span>item1</span></div>
</body>

Использование py:match часто сложнее, чем вам нужно, я предлагаю вам взглянуть на реализацию верхнего и нижнего колонтитула в шаблоне быстрого запуска, они используют более простой способ управления повторно используемыми частями шаблона.

Для конкретного случая меню вы также можете взглянуть на tgext.menu, это делает довольно легко обращаться с меню и навигационными панелями внутри приложений turbogears.

person amol    schedule 06.01.2012