我应该如何在模板之间共享代码(“模块”)?

时间:2010-11-02 05:43:54

标签: python templates module pylons

如果我在Pylons网站上有两个控制器为两个不同的模板文件提供服务,那么在每个模板上显示相同HTML的最佳方法是什么?

例如,假设我有一个博客。首页将显示最近的条目列表,每个条目都有一个“永久链接”链接到显示该条目的页面。在每个页面上,我想显示“最新条目” - 最近5篇博文的列表。

模板文件不同。控制器是不同的。如何显示“最新帖子模块”?

我应该有类似的东西:

from blog.model import posts

class BlogController(BaseController):

    def index(self):
        c.latestPosts = posts.get_latest()

        return render('home.html')

class OtherController(BaseController):

    def index(self):
        c.latestPosts = posts.get_latest()

        return render('otherpage.html')
然后

c.latestPosts将是模板呈现的链接列表。我看到的问题是,我必须在两个单独的模板文件上为此呈现HTML。如果我想更改HTML,则意味着在两个地方更改它......

我正试图想出一个巧妙的方法来做到这一点,但我的想法已经不多了。你会怎么做?

2 个答案:

答案 0 :(得分:2)

能够共享常见的HTML片段,如页眉,页脚,“登录”页面区域,侧边栏等是一个非常常见的要求。模板引擎通常为此提供方法。

如果您使用的是Mako,可以使用以下两种主要机制:

查看<%include>标记。在页面模板中,您可以指定放置各种可重用位的位置。您可以从头开始构建页面,从可重用的组件中组装它。

Mako文档中的示例:

<%include file="header.html"/>

    hello world

<%include file="footer.html"/>

继承

查看<%inherit>标记。这类似于Python等编程语言中的继承。在基本模板中,您可以设置页面的骨架。在页面模板中,您可以自定义和扩展基本模板的某些部分。

快速举例,base.mako

<html>
<head></head> 
<body>
    ${self.header()}

    ${self.body()}

</body>
</html>

<%def name="header()">

This is the common header all pages will get unless 
they override this.

</%def>

somepage.mako

<%inherit file="/base.mako"/>

This content will go into body of base.

模板引擎通常有许多漂亮的功能,我鼓励您很好地了解它们!

答案 1 :(得分:0)

虽然Pēteris的答案很好,但您可能也在寻找 Mako's <%namespace> functionality ,这与原始Python中的“import”语句非常相似。

然而,&lt;%inherit&gt;和&lt;%include&gt;也是你应该经常使用的东西。