web-dev-qa-db-ja.com

Django-すべてのテンプレートで変数を使用できるようにする方法は?

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))
54
ipegasus

必要なのはコンテキストプロセッサであり、作成は非常に簡単です。 custom_appというアプリがあるとすると、次の手順に従います。

  • custom_appINSTALLED_APPSsettings.pyに追加します(既に完了していますか?)。
  • context_processors.pyフォルダーをcustom_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")

または、TEMPLATES設定のOPTIONS.context_processorsキーに直接その文字列を含めます。

this の例、post Django 1.3のように、render_to_responseの代わりに render を使用できます。コンテキストプロセッサを明示的に渡す必要はありません。

def another_view_method(request):
    categories = Category.objects.all()
    return render(
        'eg/front_page.html',
        {'is_logged_in': is_logged_in(request), 'categories':categories}
    )
0
aydow