2014-01-11 7 views
12

base.htmlは、他のすべてのページの基本テンプレートとして使用されます。 base.htmlにはナビゲーションバーがあり、ナビゲーションバーにはユーザーが受信したメッセージの数が表示されます。したがって、base.html{{number_of_messages}}のような変数が必要です。base.htmlのDjango変数

ただし、この変数をどのように渡す必要がありますか?すべてのテンプレートはbase.htmlに拡張され、関数によってレンダリングされます。私はすべての機能でnumber_of_messagesを返すのが良い方法だとは思わない。これを実装するより良い方法はありますか?どのようにしてこの変数をすべてのテンプレートに渡すことができますか?

+1

あなたはdjangoテンプレートコンテキストプロセッサを見てきましたか?おそらく最短の答えは、独自のコンテキストプロセッサを作成し、それを設定ファイルの 'TEMPLATE_CONTEXT_PROCESSORS'に入れることです。代わりに私のコメントを答えにしますか? REF:https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext – Yeo

+0

こんにちは、私はそれを見ていません。インクルージョンタグを使用してインクルージョンタグをbase.htmlに入れることで、この目標を達成することは可能ですか? –

+0

私は主な質問に基づいて、テンプレート内の変数を 'context'と呼びます。 'include'タグは、さまざまなことを行いますが、 '{include%name"} person = "Jane" greeting = "Hello"%} 'のようなインクルードテンプレート内でコンテキストを渡すことはもちろん可能です。しかし、あなたはまだどこかの文脈が必要です... https://docs.djangoproject.com/en/dev/ref/templates/builtins/#include – Yeo

答えて

9

見てください:
https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext限り

:あなたはあなたのビューでrenderショートカットを使用(またはお使いのレスポンスをレンダリングするためにRequestContextを使用するように注意してください)

  • (あなたTEMPLATE_CONTEXT_PROCESSORS設定でas it is by defaultdjango.contrib.auth.context_processors.authを持っています)

...現在のリクエストのUser(またはAnonymousUser)テンプレートで利用可能なインスタンス{{ user }} ...そこからあなたが直接メッセージ数にアクセスできるかもしれないと推測していますか?

または、おそらくDjangoのmessages frameworkを使用していますか?

これは(renderまたはRequestContextを使用する限り){{ messages }} var(現在のユーザーのメッセージを含む)をテンプレートで利用できる独自のコンテキストプロセッサーが付属しています。これらの組み込みオプションのいずれも、あなたがいずれかのことができます必要なものを提供していない場合は「メッセージの数」のためには、{{ messages|length }}

を行うことができます。リクエストごとに実行しに追加の変数が利用できるようになります

  • make your own template context processor

    もちろんすべてテンプレート(RequestContextでレンダリング)必要な場合にのみ使用することができます

  • make your own template tag ...これはinherあなたbase.htmlと、すべてのテンプレートで使用されている場合それはbase.htmlから、すべてのページで実行されます。

+0

すばらしい答え!私を助けてくれます。ありがとうございました! –

7

タグを使用できます。

あなたBase.htmlで
#myproject/myproject/templatetags/tags.py 

from django import template 

register = template.Library() 

@register.simple_tag 
def number_of_messages(request): 
    return _number 

{% load tags %} 
    {% number_of_messages request %} 
+0

ありがとう!別の質問、templates.pyの下にtags.pyする必要がありますか? –

+0

申し訳ありません。 tags.pyはtemplatetagsの下にある必要があります。 –

3

あなたはすべてのビュー本当にで変数をしたい場合は、カスタムテンプレートのコンテキストプロセッサは、おそらく最良の選択肢です。

https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

あなただけビューの一部で変数をしたい場合は、これらのビューは、このような何か、共通の変数を移入し、共通の関数を呼び出すことができます:

def some_view(request): 
    params = _common_params(request) 
    params.update({ 
     # params specific to .some_view 
    }) 
    return render_to_response('path/to/template, params) 

次のようなカスタムデコレータを作成してください:

from functools import wraps 

def render_with_params(): 
    def _inner(view_method): 
     def _decorator(request, *args, **kwargs): 
      params = _common_params(request) 
      (template_path, view_params) = view_method(request, *args, **kwargs) 
      params.update(view_params) 
      return render_to_response(template_path, params, context_instance=RequestContext(request)) 
     return wraps(view_method)(_decorator) 
    return _inner 

@render_with_params() 
def some_view(request): 
    params = { ... } 
    return ('path/to/template', params) 
+0

ありがとうございました!私は私の状況では、私はすべてのテンプレートに変数を持つ必要があるので、コンテキストプロセッサを使うべきだと思います。ありがとうございました! –

関連する問題