• 站点布局模板
    • 问题
    • 方法
    • Tip: 在布局文件(layout.html)中定义的页面标题变量,如何在其他模板文件中赋值,如下:
      • templates/index.html $var title: This is title.
      • templates/layout.html $def with (content) <html> <head>
  • $content.title
    • Tip: 在其他模板中引用css文件,如下:####templates/login.html
      • templates/layout.html

    站点布局模板

    问题

    如何让站点每个页面共享一个整站范围的模板?(在某些框架中,称为模板继承,比如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"/>