2011-06-28 9 views
1

私のアプリケーションにリクエストがあるたびに、私はミドルウェアを使って特定のページに関連する情報を持つ「ページ」オブジェクトを検索して保存しています。私はここで、リクエストオブジェクトで、このオブジェクトへの参照を格納しています例です。テンプレートタグとリクエストオブジェクト

class PageMiddleware(object): 
    def process_request(self, request): 
     if not hasattr(request, 'page'): 
      request.page = Page.objects.get(slug=<slug>) 
     return None 

それは十分に動作しますが、私はテンプレートタグで、このオブジェクトにアクセスしたいです。テンプレートタグは「コンテキスト」の考えを参照するだけです。つまり、私はPageオブジェクトを見ることができません。

私はこれにカスタムコンテキストプロセッサを使用できますが、これは設定ファイルをさらに変更することを意味し、このアプリケーションを可能な限りカプセル化しておきたいと思います。たとえば、デバッグツールバーアプリケーションは、TEMPLATE_CONTEXT_PROCESSORSを変更せずにテンプレートコンテキストにデータを追加することができます。要するに、ミドルウェアを使用するだけで、理想的にはテンプレートタグのPageオブジェクトにアクセスしたいと考えています。何か案は?

編集:私は次のクラスで、標準のテンプレートタグを使用しています:

class GetPageContentNode(Node): 
    def __init__(self, key): 
     self.key = key 

    def render(self, context): 
     return context['request'].page 

答えて

2

は、このを見てください、あなたは、登録時にtakes_contextを渡すことによって、リクエストオブジェクト(およびあなたのオブジェクト)へのアクセスを得ることができます

:テンプレートタグ

Access request in django custom template tags

は、このページの "takes_context" の検索を持っています

+0

感謝を。私は元の記事で、私が標準タグを使用していて、包含タグではないと言っていたはずです。コンテキスト['request']を呼び出すと、キーエラーが発生します。 – Hanpan

+0

これは通常のテンプレートタグでも機能します。インクルードとシンプルなテンプレートタグは、通常のテンプレートタグのラッパーにすぎません –

1

コールのようなcontext_instanceパラメータを持つすべてのrender_to_response、:Daniel Rosemanで推薦して

def some_view(request): 
    # ... 
    return render_to_response('my_template.html', 
          my_data_dictionary, 
          context_instance=RequestContext(request)) 

EDITED:あなたのTEMPLATE_CONTEXT_PROCESSORS設定に

そして追加django.core.context_processors.request

+1

実際には、この2番目の部分は必要ありません。既に[リクエストコンテキストプロセッサ]があります(https://docs.djangoproject.com/ja/1.3/ ref/templates/api /#django-core-context-processors-request)、特にsettings.pyで有効にする必要があります。 –

+0

@ダニエル:完璧です。 –

0

これを試してみてください:返信用

class GetPageContentNode(Node): 
    def __init__(self, key): 
     self.key = key 

    def render(self, context): 
     request = template.Variable('request').resolve(context) # here's the magic! 
     return request.page 
関連する問題