Django: context_processorsの使い方

2010年3月25日

Djangoには、テンプレートファイル内でのみ利用できるテンプレート変数と、グローバル変数のように、どのテンプレートファイルからも利用できるテンプレート変数も存在しています。 そのようなグローバル変数的なテンプレート変数のことをcontext_processorと呼びます。

settings.pyにて、TEMPLATE_CONTEXT_PROCESSORS変数に、テンプレート変数を返すメソッドを登録しておくと、どのビューからでも当該変数をコンテキストに追加することが可能となります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ emacs settings.py 
   TEMPLATE_CONTEXT_PROCESSORS = (
          "hogeapp.context_processors.user_name",
       ..., ) 

$ emacs hogeapp/context_processors.py
   def user_name(request): 
       if ( request.user.is_authenticated() ): 
            return {"uname": request.user.username} 
       else: 
            return {"uname": None} 
# 上記の例は、アカウント名を「uname」というテンプレート変数に
# 格納するような設定です。

context_processors変数を呼び出したい場合は、ビューにて明示的にコンテキストに追加する必要があります。しかし、context_processors単位ではなく、全体を一気に追加することができます。 

1
2
3
return render_to_response('my_template.html', 
                          my_dict , 
                          context_instance=RequestContext(request))

上記のように、ビューでレスポンスを返す際に「context_instance」にRequestContext(request)を代入することで、テンプレートファイルmy_template.htmlからcontext_processors変数が参照可能となります。 

当然、context_processors変数を作成すること自体オーバーヘッドになりますので、必要なときののみ作成するようにしましょう。