2014-01-11 4 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

안녕하세요 여보, 나는 그것을 보지 않았습니다. 포함 태그를 사용하고 inclusion 태그를 base.html에 넣음으로써이 목표를 달성 할 수 있습니까? –

+0

나는 주된 질문에 기초하여, 템플릿의 변수를'context' 라 부른다. 'include' 태그는 다른 일을하지만 물론'{% include "name_snippet.html"with person = "Jane"greeting = "Hello"%}'와 같이 포함 된 템플릿 내에서 컨텍스트를 전달할 수 있습니다. 하지만 그래도 상황이 어딘가에 남아 있어야합니다 ... https://docs.djangoproject.com/en/dev/ref/templates/builtins/#include – Yeo

답변

9

보십시오 :,210 https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext

만큼 :

  • 당신이보기에 render 바로 가기를 사용 (또는 다른 응답을 렌더링하기 위해 RequestContext를 사용하는데주의를 기울여야) (당신의 TEMPLATE_CONTEXT_PROCESSORS 설정에서
  • django.contrib.auth.context_processors.authas it is by default을)

... 현재 요청은 User (또는 AnonymousUser) 템플릿에서 사용할 수있는 인스턴스 {{ user }} ... 거기에서 추측하고 있습니다. 직접 메시지 수에 액세스 할 수 있습니까?

아니면 장고의 messages framework을 사용하고 계십니까?

는 자신의 상황에 맞는 프로세서와 함께 제공되는 (만큼 당신이 render 또는 RequestContext를 사용할 때) 템플릿에서 사용할 수있는 (현재 사용자에 대한 메시지를 포함)를 {{ messages }} VAR를 만들 것입니다.이러한 내장 옵션 중 어느 것도 당신이 중 하나를 할 수있는 필요 얻을 수 없을 경우 '메시지의 수'를 들어 당신은 {{ messages|length }}

을 수행 할 수 있습니다 모든 요청에 ​​대해 실행에 추가 변수를 사용할 수 있도록합니다

  • make your own template context processor

    필요한 경우

  • make your own template tag (A RequestContext로 렌더링 할 때)에만 사용할 수 있습니다 모든 템플릿은 ... 물론이 당신의 base.html에 사용 된 모든 템플릿 inher 경우 그것은 base.html에서부터 모든 페이지에 대해 계속 실행됩니다.

+0

대단한 답변입니다. 나에게 많은 도움이된다. 고맙습니다! –

7

태그를 사용할 수 있습니다. 에서

#myproject/myproject/templatetags/tags.py 

from django import template 

register = template.Library() 

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

당신의 Base.html

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

감사합니다! 또 다른 질문은 tags.py가 templates 폴더에 있어야합니까? –

+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

감사합니다. 내 상황에서는 모든 템플릿에 변수가 있어야하므로 컨텍스트 프로세서를 사용해야한다고 생각합니다. 고맙습니다! –