区块关键词允许您定义页面的一个或者多个主模板的外壳,然后在需要时填入或者重载.

基础模板查询顺序

从Hugo版本V0.63开始, 基础模板的查询顺序紧随其适用的模板. (比如 _default/list.html).

参考 模板查询顺序 获得更多细节和例子的信息.

定义基础模板

下面例子定义了一个简单的基础模板_default/baseof.html. 作为一个缺省模板, 它是所有页面呈现的外壳, 除非重新指明了接近模板查询顺序开始的另一个*baseof.html.

layouts/_default/baseof.html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>{{ block "title" . }}
      <!-- 区块可以包含缺省内容  -->
      {{ .Site.Title }}
    {{ end }}</title>
  </head>
  <body>
    <!-- 所有模板都分享的代码, 比如一个头部部分 -->

    {{ block "main" . }}
      <!-- 不同模板开始不同的页面的部分  -->
    {{ end }}

    {{ block "footer" . }}
    <!-- 更多共享代码, 可能是页脚,但是也可以被重载如果有需要-->
    {{ end }}
  </body>
</html>

重载基础模板

基于上面的基础模板, 可以定义默认的list模板. 默认的list模板从基础模板中继承所有定义在 "main" 之前的代码, 然后实现自己的"main" 区块:

layouts/_default/list.html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10

{{ define "main" }}
  <h1>Posts</h1>
  {{ range .Pages }}
    <article>
      <h2>{{ .Title }}</h2>
      {{ .Content }}
    </article>
  {{ end }}
{{ end }}

这样将我们的 “main”(基本为空白)区块内容替换为对list模板有意义的内容。 这里, 我们并没有定义"title" 区块, 所以从基础模板中的内容在lists中仍然不变.

下面默认的单页模板例子中显示如何重载基础模板中的 "main""title"区块, 并且应用了针对默认的单页模板特别的代码:

layouts/_default/single.html
1
2
3
4
5
6
7
8
9

{{ define "title" }}
  <!-- 这里覆盖了 baseof.html 中的默认值 "{{.Site.Title}}"-在一开始的例子中的 -->
  {{ .Title }} &ndash; {{ .Site.Title }}
{{ end }}
{{ define "main" }}
  <h1>{{ .Title }}</h1>
  {{ .Content }}
{{ end }}