Django入门与实践-第12章:复用模板

到目前为止,我们一直在复制和粘贴 HTML 文档的多个部分。从长远来看是不可行的。这也是一个坏的做法。

在这一节我们将重写 HTML 模板,创建一个 master page(母版页),其他模板添加它所独特的部分。

templates 文件夹中创建一个名为 base.html 的文件: {% raw %}

templates/base.html

  1. {% load static %}<!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>{% block title %}Django Boards{% endblock %}</title>
  6. <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
  7. </head>
  8. <body>
  9. <div class="container">
  10. <ol class="breadcrumb my-4">
  11. {% block breadcrumb %}
  12. {% endblock %}
  13. </ol>
  14. {% block content %}
  15. {% endblock %}
  16. </div>
  17. </body>
  18. </html>

这是我们的母版页。每个我们创建的模板都 extend(继承) 这个特殊的模板。现在我们介绍 {% block %} 标签。它用于在模板中保留一个空间,一个”子”模板(继承这个母版页的模板)可以在这个空间中插入代码和 HTML。

{% block title %} 中我们还设置了一个默认值 “Django Boards.”。如果我们在子模板中未设置 {% block title %} 的值它就会被使用。

现在让我们重写我们的两个模板: home.htmltopics.html

templates/home.html

  1. {% extends 'base.html' %}
  2. {% block breadcrumb %}
  3. <li class="breadcrumb-item active">Boards</li>
  4. {% endblock %}
  5. {% block content %}
  6. <table class="table">
  7. <thead class="thead-inverse">
  8. <tr>
  9. <th>Board</th>
  10. <th>Posts</th>
  11. <th>Topics</th>
  12. <th>Last Post</th>
  13. </tr>
  14. </thead>
  15. <tbody>
  16. {% for board in boards %}
  17. <tr>
  18. <td>
  19. <a href="{% url 'board_topics' board.pk %}">{{ board.name }}</a>
  20. <small class="text-muted d-block">{{ board.description }}</small>
  21. </td>
  22. <td class="align-middle">0</td>
  23. <td class="align-middle">0</td>
  24. <td></td>
  25. </tr>
  26. {% endfor %}
  27. </tbody>
  28. </table>
  29. {% endblock %}

home.html 的第一行是 {% extends 'base.html' %}。这个标签用来告诉 Django 使用 base.html 作为母版页。之后,我们使用 blocks 来放置这个页面独有的部分。

templates/topics.html

  1. {% extends 'base.html' %}
  2. {% block title %}
  3. {{ board.name }} - {{ block.super }}
  4. {% endblock %}
  5. {% block breadcrumb %}
  6. <li class="breadcrumb-item"><a href="{% url 'home' %}">Boards</a></li>
  7. <li class="breadcrumb-item active">{{ board.name }}</li>
  8. {% endblock %}
  9. {% block content %}
  10. <!-- just leaving it empty for now. we will add core here soon. -->
  11. {% endblock %}

topics.html 中,我们改变了 {% block title %} 的默认值。注意我们可以通过调用 {{ block.super }} 来重用 block 的默认值。这里我们使用的网页标题是 base.html 中定义的 “Django Boards”。所以对于 “Python” 的 board 页面,这个标题是 “Python - Django Boards”,对于 “Random” board 标题会是 “Random - Django Boards”。

现在我们运行测试,然后会看到我们没有破坏任何东西:

  1. python manage.py test
  1. Creating test database for alias 'default'...
  2. System check identified no issues (0 silenced).
  3. .......
  4. ----------------------------------------------------------------------
  5. Ran 7 tests in 0.067s
  6. OK
  7. Destroying test database for alias 'default'...

棒极了!一切看起来都很成功。

现在我们有了 bast.html 模板,我们可以很轻松地在顶部添加一个菜单块:

templates/base.html

  1. {% load static %}<!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>{% block title %}Django Boards{% endblock %}</title>
  6. <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
  7. </head>
  8. <body>
  9. <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
  10. <div class="container">
  11. <a class="navbar-brand" href="{% url 'home' %}">Django Boards</a>
  12. </div>
  13. </nav>
  14. <div class="container">
  15. <ol class="breadcrumb my-4">
  16. {% block breadcrumb %}
  17. {% endblock %}
  18. </ol>
  19. {% block content %}
  20. {% endblock %}
  21. </div>
  22. </body>
  23. </html>

3-11.png

3-12.png

我使用的 HTML 是 Bootstrap 4 Navbar 组件 的一部分。

我喜欢的一个比较好的改动是改变页面的 “logo”(.navbar-brand)。

前往 fonts.google.com,输入 “Django Boards” 或者任何你项目给定的名字然后点击 apply to all fonts(应用于所有字体)。浏览一下,找到一个你喜欢的字体。

3-13.png

bast.html 模板中添加这个字体:

  1. {% load static %}<!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>{% block title %}Django Boards{% endblock %}</title>
  6. <link href="https://fonts.googleapis.com/css?family=Peralta" rel="stylesheet">
  7. <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
  8. <link rel="stylesheet" href="{% static 'css/app.css' %}">
  9. </head>
  10. <body>
  11. <!-- code suppressed for brevity -->
  12. </body>
  13. </html>

现在在 static/css 文件夹中创建一个新的 CSS 文件命名为 app.css

static/css/app.css

  1. .navbar-brand {
  2. font-family: 'Peralta', cursive;
  3. }

3-14.png

{% endraw %}