Django テンプレートのグローバル変数を実装します。
全てのテンプレートで参照できる変数が欲しい時があります。
Django では、context_processors を使います。
デフォルトの状態で、いくつかの変数(例えば request など)が、全てのテンプレートで参照できる状態になっていますが、それは、これから実装する settings.py の TEMPLATES の context_processors に定義しているからです。
Contents
完成イメージ
バージョン
- Python 3.6.4
- Django 2.0.3
インストール
Python, Django
Python と Django のインストールは、Python Web フレームワーク Django の環境を構築するの記事を参考にしてください。
実装
settings.py
ALLOWED_HOSTS = ['*'] INSTALLED_APPS = [ 'app.apps.AppConfig' ... ] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ ... 'ctx_proc.template.context_processors.common', ], }, }, ]
まず、settings.py で context_processor を定義します。
TEMPLATES の OPTIONS 下に ‘context_processors’ があります。ここでテンプレートのグローバル変数を返す、関数を登録します。
context_processors.py
def common(request): context = {} context['ctx_proc_value'] = 'このコンテキストは、グローバルです。' return context
次に、settings.py の context_processors に登録した関数を実装します。
views.py
from django.views.generic import TemplateView from django.shortcuts import render def func_view(request): context = {} context['func_value'] = 'このコンテキストは、関数ベースビューです。' return render(request, 'app/index.html', context) class ClassView(TemplateView): template_name = 'app/index.html' def get_context_data(self, **kwags): context = super().get_context_data(**kwargs) context['class_value'] = 'このコンテキストは、クラスベースビューです。' return context
次にビューです。関数ベースビューとクラスベースビューを実装しました。
関数ベースビューは、render 関数にテンプレートで使用する変数を渡します。
クラスベースビューは、Django の get_context_data 関数をオーバーライドして、テンプレートで使用する変数を返します。
urls.py
from django.urls import path from app.views import func_view, ClassView urlpatterns = [ path('func-view/', func_view), path('class-view/', ClassView.as_view()), ]
テンプレート
index.html
<html> <head> <title>Django テンプレートのグローバル変数を定義する</title> </head> <body> <h1>Django テンプレートのグローバル変数を定義する</h1> <p>path: {{ request.path }}</p> <p>ctx_proc_value: {{ ctx_proc_value }}</p> <p>func_value: {{ func_value }}</p> <p>class_value: {{ class_value }}</p> </body> </html>
グローバル変数、関数ベースビュー変数、クラスベースビュー変数を確認するテンプレートを用意します。
tree
$ tree . ├── app │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── templates │ │ └── app │ │ └── index.html │ └── views.py ├── ctx_proc │ ├── __init__.py │ ├── settings.py │ ├── template │ │ └── context_processors.py │ ├── urls.py │ └── wsgi.py └── manage.py 6 directories, 11 files
ファイル構成はこのようになりました。
動作確認
runserver
$ python3.6 manage.py rumserver 0.0.0.0:8000
動作確認は、いつものように runserver を使います。
runserver を起動したら、以下の URL にアクセスします。
http://192.168.33.10:8000/func-view/ にアクセス
/func-view/ は、関数ベースビューですので、グローバル変数と関数ベースビュー変数が確認できます。
http://192.168.33.10:8000/class-view/ にアクセス
/class-view/ は、クラスベースビューですので、グローバル変数とクラスベースビュー変数が確認できます。
まとめ
Django テンプレートのグローバル変数を実装しました。
テンプレートで使用頻度の高い変数は、ビュー毎に定義するのではなく、context_processors を使いましょう。