5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Djangoのテンプレート内で定数を扱う

Posted at

はじめに

Djangoのテンプレート内でドメイン名やサイト名などの基本的に固定となる定数値を扱いたいとき、Context Processorという機能を利用して、都度ビュー側から定数を渡さずにテンプレート内から定数のように扱うことができます。

環境

  • Django 2.2

Context Processor とは

Context Processorはビューからテンプレートへコンテキストオブジェクトを渡す際に変数を追加する処理を記述できる関数です。
テンプレート内で利用するcsrf_token等がこの仕組みで実装されています。

Context Processor の作成

Context ProcessorはHTTP Requestオブジェクトを引数として、辞書型のオブジェクトを返す関数として定義します。

関数の名前は任意の名前で作成し、ファイルはアプリケーションのディレクトリ配下等に作成します。

hogeapp/context_processors.py
def my_context_processor(req):
    return {
        'domain_name': 'https://hogehoge.com',
        'site_name': 'Hogehoge Site',
    }

上記の例では単純に辞書オブジェクトを返却しているのみですが、通常の関数同様に処理を記述することもできます。これを利用して外部ファイルに別で定義した定数を参照したり、環境変数の値から環境によって値を変える等の使い方も可能です。

config.py設定

作成したContext Processorを利用するには、config.pyへの設定が必要になります。
config.pyで定義されているTEMPLATESのOPTIONSにあるcontext_processorsへ前項で作成した関数を追加します。

config.py
TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'hogeapp.context_processors.my_context_processor', # 追加
            ],
        },
    },
]

テンプレートからの呼び出し方法

Context Processorで追加される変数は、テンプレート内から通常のコンテキストの変数と同じように利用できます。

template.html
<link rel="icon" href="{{ domain_name }}/favicon.ico">
<title>{{ site_name }}</title>

参考

The Django template language: for Python programmers | Django ドキュメント | Django
https://docs.djangoproject.com/ja/2.2/ref/templates/api/#writing-your-own-context-processors

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?