Django variable in base.html
You can use tags.
#myproject/myproject/templatetags/tags.py
from django import template
register = template.Library()
@register.simple_tag
def number_of_messages(request):
return _number
In your Base.html
{% load tags %}
{% number_of_messages request %}
Have a look at:
https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext
As long as:
- you use the
render
shortcut in your view (or otherwise take care to use aRequestContext
to render your response) - have
django.contrib.auth.context_processors.auth
in yourTEMPLATE_CONTEXT_PROCESSORS
setting (as it is by default)
...then you have the current request's User
(or AnonymousUser
) instance available in your template as {{ user }}
...I am guessing from there you may be able to access the number of messages directly?
Or perhaps you are using Django's messages framework?
This comes with it's own context processor which (as long as you use render
or RequestContext
) will make a {{ messages }}
var (containing the messages for current user) available in your templates. For 'number of messages' you can do {{ messages|length }}
If none of these built-in options provide what you need you can either:
make your own template context processor which will run for every request and make additional variables available to all templates (when rendered with a
RequestContext
)make your own template tag which can be used only where needed... of course if this is used in your
base.html
and all templates inherit frombase.html
then it's still going to run for every page.
I find the simplest steps to passing variables to your base templates in django is to add a context_processor.py file like so:
In your app create context_processors.py and declare your variables e.g.:
# context_processors.py
def message_processor(request):
if request.user.is_authenticated:
no_msgs = request.user.profile.msgs
else:
no_msgs = 0
return {
'messages' : no_msgs
}
Then register your process or under TEMPLATES in your settings.py file:
TEMPLATES = [
{
...
'context_processors': [
...
# custom
'appname.context_processors.message_processor',
],
},
},
]
And then you will be able to get that variable anywhere in your app as:
{{ messages }}