1

好的,我来自 Django,所以如果我写的东西没有意义,请原谅我。我正在尝试使用 genshi 在 turbogears 中“覆盖”我的主模板的一部分。到目前为止,我只尝试了 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 之外。我究竟做错了什么?

4

1 回答 1

2

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 应用程序中的菜单和导航栏。

于 2012-01-06T00:45:01.883 回答