先程の作業で comment_list.html と comment_detail.html の内容は多くが共通していた.特にページのデザインなどに関する部分(レイアウト)をテンプレート化しておくと,アプリケーションのデザインの変更などが1つのファイルを編集するだけでできるうようになる.若干面倒な作業になるかもしれないが,後々のことを考えるとこのあたりでテンプレート化にチャレンジしておく価値は多いにある.
  まず,comments/templates/comments/comment_list.html を comments/templates/base.html としてコピーし,次のように編集する.つまり,<body> の中で,{% block content %} と {% endblock content %} の中身を削除し,<title> ... </title> の中に {% block title %}{% endblock %} を入力する.
comments/templates/base.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
  <title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}
{% endblock content %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
</body>
</html>
  次に,comments/templates/comments/comment_list.html から,base.html と共通する部分を取り払い,base.html を読み込む命令と,タイトルを設定する部分を追加する.なお,5行目の {% endblock %} は {% endblock title %} と記述しても良い.また逆に,最後の行の {% endblock content %} は {% endblock %} でも良い.{% block content %} はその中身が長いため,{% endblock content %} と省略せずに入力した方が,あとでその範囲を確認しやすいでしょう.
comments/templates/comments/comment_list.html
{% extends "base.html" %}
{% block title %}
コメント一覧
{% endblock %}
{% block content %}
  <div class="container">
    <h1 class="my-5">コメント一覧</h1>
    {% for comment in object_list %}
    <div class="card mb-3">
      <div class="card-body">
        <h5 class="card-title">
          <a href="{% url 'comments:show' comment.id  %}">
            {{ comment.title }}
          </a>
        </h5>
        <p class="card-text">{{ comment.body }}</p>
      </div>
    </div>
    {% endfor %}
  </div>
{% endblock content %}
この作業によって生成される HTML ファイルに変化はなく,これまでと同じ一覧表示の結果が得られるはずである.しかし,この作業によって HTML ファイルの見通し格段に良くなりましたね.
同様に,comment_detail.html もテンプレートを使うように変更しておこう.
comments/templates/comments/comment_detail.html
{% extends "base.html" %}
{% block title %}
コメント {{ comment.id }}
{% endblock %}
{% block content %}
  <div class="container">
    <h1 class="my-5">コメント {{ comment.id }}</h1>
    <div class="card mb-3">
      <div class="card-header">
        ID : {{ comment.id }}
      </div>
      <div class="card-body">
        <p class="card-text">Title : </p>
        <h5 class="card-title">{{ comment.title }}</h5>
        <p class="card-text">Body : </p>
        <p class="card-text">{{ comment.body }}</p>
      </div>
      <div class="card-footer">
        Created at : {{ comment.created_at }}<br>
        Updated at : {{ comment.updated_at }}
      </div>
    </div>
  </div>
{% endblock content %}