2013-06-18 9 views
6

使用して応答にコンテキストを追加します。返された修飾関数は次のようになりますようにジャンゴ:次のシナリオを考えるとデコレータ

from django.shortcuts import render 


def decorator(view): 
    def wrapper(request, *args, **kwargs): 
     context = {'foo': 'bar'} 
     # Logic ... 
     return view(request, *args, **kwargs) 
    return wrapper 


@decorator 
def index(request): 
    return render(request, 'index.html') 

を、私は、デコレータはビューにコンテキスト辞書を追加したいのですが:

return render(request, 'index.html', context) 

これは可能ですか?

+0

はい、確認してください。それは可能です。多くのビュー関数decotarorsがあります。 [here](https://docs.djangoproject.com/en/dev/topics/http/decorators/)あなたは誰か – lalo

+2

これはまさに[ContextProcessors](https://docs.djangoproject.com/ja/)ですdev/ref/templates/api /#subclassing-context-requestcontext)はのためのものです。 – J0HN

+0

すべてのテンプレート:コンテキストプロセッサー。いくつかのビューの場合:デコレータ – lalo

答えて

4

検索の束の後で、私は元の機能に余分な塊を必要としない方法でこれを行う方法を考え出しました。キーはDjangoのTemplateResponseオブジェクトで、応答がユーザーに送信される直前までテンプレートのレンダリングを延期し、デコレータ(およびミドルウェア、FWIW)による処理の機会を開きます。

は、ここでそれが今のようになります。

from django.template.response import TemplateResponse  

def decorator(view): 
    def wrapper(request, *args, **kwargs): 
     r = view(request, *args, **kwargs) 
     r.context_data = {'foo': 'bar'} 
     return r.render() 
    return wrapper 

@decorator 
def index(request): 
    return TemplateResponse(request, 'index.html') 
+2

あなたは正しいですが、応答は常にTemplateResponseではないので注意してください。 – s29

3

これはあなたが現在あなたの関数が書かれている方法では不可能ですが、同じ動作のために、以下のような何かを行うことができます:

from django.shortcuts import render  

def decorator(view): 
    def wrapper(request, *args, **kwargs): 
     context = {'foo': 'bar'} 
     args = args + (context,) 
     return view(request, *args, **kwargs) 
    return wrapper  

@decorator 
def index(request, *args): 
    return render(request, 'index.html', *args) 

これはデコレータはにあなたのcontext辞書を追加しますrender()に渡されたindex()に渡される位置引数の最後。

関連する問題