Python | Django | テンプレートの継承方法

2021年6月21日

公開日:2021/6/21

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

前記事にて,Viewの値をテンプレートに渡す方法を記した.前記事での設定をそのまま引き継いだ上で,本記事では,テンプレートの継承方法を以下に記す.

◆実施環境

Python 3.8.8
Django 3.2.3

■テンプレートの継承方法

“tmp_project/templates"に親テンプレートファイルである"base.html"および子テンプレートファイルである"sub1.html"と"sub2.html"を作成する."tmp_project"の構成は以下のようになる.

親テンプレートファイルである"tmp_project/templates/base.html"には,以下のように記述する.

<!DOCTYPE html>
<html>
<head>
  <title>{% block title %}My site{% endblock %}</title>
</head>
<body>
  <h2>My site for template inheritance</h2>
  {% block content %}{% endblock %}
</body>
</html>

子テンプレートファイルである"tmp_project/templates/sub1.html"には,以下のように記述する.

{% extends "base.html" %}
{% block title %}sub1 page{% endblock %}
{% block content%}
  <h2>sub1 page for template inheritance</h2>
{% endblock %}

もう1つの子テンプレートファイルである"tmp_project/templates/sub2.html"には,以下のように記述する.

{% extends "base.html" %}
{% block title %}sub2 page{% endblock %}
{% block content%}
  <h2>sub2 page for template inheritance</h2>
{% endblock %}

“tmp_app/views.py"にsub1とsub2の関数を追記する.追記後のviews.pyは以下のようになる.

from django.shortcuts import render

def index(request):
  return render(request,'index.html',context={
    'greeting_mo':'Good Morning',
    'greeting_af':'Good Afternoon',
    'greeting_ev':'Good Evening',
    'drink_list':['water','coffee','tea','milk'],
  })

def sub1(request): # 以降が追記箇所
  return render(request,'sub1.html')

def sub2(request):
  return render(request,'sub2.html')

“tmp_app/utls.py"にpathを2種類追記する.追記後のurls.pyは以下のようになる.

from django.urls import path
from . import views

app_name = 'tmp_app'

urlpatterns = [
  path('',views.index,name='index'),
  path('sub1',views.sub1,name='sub1'), # 追記箇所
  path('sub2',views.sub2,name='sub2'), # 追記箇所
]

“tmp_project/urls.py”は前回編集したので変更することはないが,ブラウザを開く際に”template_app/”が必要なので,現在のコードを以下に記す.

from django.contrib import admin 
from django.urls import path, include

urlpatterns = [ 
  path('admin/', admin.site.urls), 
  path('template_app/', include('tmp_app.urls')), 
]

ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する.”tmp_project”のディレクトリで”python manage.py runserver”を実行すると,以下が出力される.

System check identified no issues (0 silenced).
June 21, 2021 - 17:44:35
Django version 3.2.3, using settings 'tmp_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

“http://127.0.0.1:8000/”をクリックし,ブラウザを開くと以下のように表示される.

ブラウザのURLに”http://127.0.0.1:8000/template_app/sub1”を記入し,ブラウザを開くと,”sub1.html”に記述した内容が以下のように出力される.

ブラウザのURLに”http://127.0.0.1:8000/template_app/sub2”を記入し,ブラウザを開くと,”sub1.html”に記述した内容が以下のように出力される.

以上