1. ホーム
  2. python

[解決済み] Django - 変数をすべてのテンプレートで使用できるようにするには?

2023-05-11 17:06:47

質問

views.pyファイルのすべてのメソッドで同じコードを繰り返さずに、すべてのテンプレートに変数を渡す方法を知りたいです。

以下の例では、カテゴリ(カテゴリオブジェクトの配列)をWebアプリのすべてのテンプレートで利用できるようにしたいと思います。

Eg: I would like to avoid writing 'categories':categories on every method. Is it possible?

1つのビューメソッド

def front_page(request):
    categories = Category.objects.all()
    if is_logged_in(request) is False:
        return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request))
    else:
        return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))

別のビューメソッド

def another_view_method(request):
    categories = Category.objects.all()
    return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))

どのように解決するのですか?

コンテキストプロセッサは簡単に作ることができます。という名前のアプリがあると仮定します。 custom_app という名前のアプリがあると仮定して、次のステップに従います。

  • 追加 custom_appINSTALLED_APPSsettings.py (に変更します(もうやってますよね)。
  • を作成します。 context_processors.pycustom_app フォルダーに格納します。
  • その新しいファイルに以下のコードを追加してください。

    def categories_processor(request):
     categories = Category.objects.all()            
     return {'categories': categories}
    
    
  • 追加 context_processors.pyTEMPLATE_CONTEXT_PROCESSORSsettings.py

    TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
    
    

そして、今度は {{categories}} を使うことができるようになりました :D

Django 1.8 の時点では

を追加するには TEMPLATE_CONTEXT_PROCESSORS を追加するには、設定に次のコードを追加する必要があります。

TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")

あるいは、その文字列を直接 OPTIONS.context_processors のキーに直接記述することもできます。 TEMPLATES を設定します。