站点布局模板

问题

如何让站点每个页面共享一个整站范围的模板?(在某些框架中,称为模板继承,比如ASP.NET中的母版页)

方法

我们可以用 base 属性来实现:

  1. render = web.template.render('templates/', base='layout')

现在如果你调用render.foo()方法,将会加载templates/foo.html 模板,并且它将会被 templates/layout.html模板包裹。

“layout.html” 是一个简单模板格式文件,它包含了一个模板变量,如下:

  1. $def with (content)
  2. <html>
  3. <head>
  4. <title>Foo</title>
  5. </head>
  6. <body>
  7. $:content
  8. </body>
  9. </html>

在某些情况,如果不想使用基本模板,只需要创建一个没有base属性的render对象,如下:

  1. render_plain = web.template.render('templates/')

Tip: 在布局文件(layout.html)中定义的页面标题变量,如何在其他模板文件中赋值,如下:

templates/index.html $var title: This is title.
  1. <h3>Hello, world</h3>
templates/layout.html $def with (content) <html> <head>

$content.title

</head> <body> $:content </body> </html>

Tip: 在其他模板中引用css文件,如下:####templates/login.html

  1. $var cssfiles: static/login.css static/login2.css
  2. hello, world.

templates/layout.html

  1. $def with (content)
  2. <html>
  3. <head>
  4. <title>$content.title</title>
  5. $if content.cssfiles:
  6. $for f in content.cssfiles.split():
  7. <link rel="stylesheet" href="$f" type="text/css" media="screen" charset="utf-8"/>
  8. </head>
  9. <body>
  10. $:content
  11. </body>
  12. </html>

输入的HTML代码如下:

  1. <link rel="stylesheet" href="static/login.css" type="text/css" media="screen" charset="utf-8"/>
  2. <link rel="stylesheet" href="static/login2.css" type="text/css" media="screen" charset="utf-8"/>