Django テンプレートのグローバル変数を実装する

シェアする

Django テンプレートのグローバル変数を実装します。

全てのテンプレートで参照できる変数が欲しい時があります。

Django では、context_processors を使います。

デフォルトの状態で、いくつかの変数(例えば request など)が、全てのテンプレートで参照できる状態になっていますが、それは、これから実装する settings.py の TEMPLATES の context_processors に定義しているからです。

完成イメージ

バージョン

  • 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 を使いましょう。

シェアする

フォローする