Django テンプレートの継承 (テンプレートインヘリタンス)

実際に Django でページを作る際には、これまでの Hello, world 的なプログラムでやったような、 view 関数内の文字列で html をゼロから作るようなことより、テンプレートを活用する方が楽だし、おすすめです。

テンプレートでページを作っていくと、使いまわしができるように構成しないと1ページ増やす毎にテンプレートも1ページ増えることになってしまいます。 こうなると、全ページに共通する部分を全テンプレートに適用するのも面倒になりますし、サイト全体のレイアウトを整えるのが難しくなってしまいがちです。

Web サイトを構築したことがあるひとはよくご存知と思いますが、Webサイト(Webアプリケーション)のデザインの変更は、 デスクトップアプリケーションのときに通常行われる変更よりも断然頻度が高いものです。

Djangoのテンプレートでは、テンプレート継承 (Template Inheritance) と呼ばれる仕組みがあります。これによって、一つのテンプレートで決めたレイアウトに、 他のテンプレートがそこに値をはめ込むといったようなことができるようになります。

これは、マイクロソフトの Web アプリケーション構築フレームワークである ASP.NET などでのマスターファイルに似ています。

テンプレート・インヘリタンス

では、具体的にテンプレート継承(テンプレート・インヘリタンス)の方法を示します。

例えば、継承の元となる親テンプレートで、次のように content1 というブロックを定義します。

<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta charset="UTF-8">
  <title>index.html</title>
  <style>
  body {
    background-color: #B2EBF2;
    font-family: sans-serif;
  }
  </style>
</head>
<body>
{% block content1 %}
{% endblock %}
</body>
</html>

ブロックは block テンプレートタグで定義します。block に続く文字がブロックの名前になります。

この親テンプレートファイルを、例えば base.html という名前にします。

子テンプレートでは、次のように extends タグで親テンプレートを指定して、 さらに block タグを用いてブロックの中身を書きます。

{% extends "myapp1/base.html" %}
{% block content1 %}
<h1>Hello, {{fname}}!</h1>
{% endblock %}

こうしておいて、実際にテンプレートを render_to_response などで指定するときは、 子テンプレートを指定すれば、自動的に親テンプレートも読み込まれてレスポンスとなる HTML が生成されることになります。

また、親テンプレートに {{ var1 }} のような形式で指定したパラメータも使えます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門