89

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

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

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

ワンビュー方式

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))
4

1 に答える 1

144

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

  • に追加custom_appし ます (既に実行済みですよね?);INSTALLED_APPSsettings.py
  • フォルダを作成context_processors.pyします。custom_app
  • その新しいファイルに次のコードを追加します。

    def categories_processor(request):
     categories = Category.objects.all()            
     return {'categories': categories}
    
  • に追加context_processors.py_TEMPLATE_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

于 2013-07-27T19:15:44.317 に答える