如果我在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,则意味着在两个地方更改它......
我正试图想出一个巧妙的方法来做到这一点,但我的想法已经不多了。你会怎么做?
答案 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;也是你应该经常使用的东西。