2014-01-11 4 views
12

base.html используется в качестве базового шаблона для всех других страниц. base.html имеет панель навигации и на панели навигации, я хочу показать количество сообщений, полученных пользователем. Таким образом, мне нужно иметь переменную типа {{number_of_messages}} в base.html.Переменная Django в base.html

Однако, как передать эту переменную? Каждый шаблон расширяет 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

Думаю, исходя из вашего основного вопроса, переменная в шаблоне называется «контекстом». тег 'include', делает разные вещи, но, конечно, вы можете передать контекст внутри включенного шаблона, например' {% include "name_snippet.html" с 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, чтобы сделать свой ответ)
  • имеют django.contrib.auth.context_processors.auth в настройках TEMPLATE_CONTEXT_PROCESSORS (as it is by default)

... тогда у вас есть текущий запрос User (или AnonymousUser) экземпляр доступен в вашем шаблоне как {{ user }} ... Я предполагаю, что оттуда вы сможете получить доступ к количеству сообщений напрямую?

Возможно, вы используете Django's messages framework?

Это приходит с собственным контекстом процессором, который (до тех пор, пока вы используете render или RequestContext) сделает {{ messages }} вара (содержащее сообщения для текущего пользователя), доступных в шаблонах.Для «количества сообщений» вы можете сделать {{ messages|length }}

Если ни один из этих встроенных опций не обеспечивают то, что вам нужно вы можете:

  • make your own template context processor, который будет работать для каждого запроса и сделать дополнительные переменные доступны все шаблоны (при визуализации с RequestContext)

  • make your own template tag, которые могут быть использованы только там, где нужно ... если, конечно, это используется в вашем 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

Спасибо! Другой вопрос, должен ли tag.py находиться под папкой шаблонов? –

+0

Извините. Теги.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

Спасибо! Я думаю, что в моей ситуации я должен использовать процессор контекста, так как мне нужно иметь переменную во всех шаблонах. Спасибо! –

Смежные вопросы