Provide extra context to all views
Solution 1:
You could use the template context processor:
myapp/context_processors.py
:
from django.contrib.auth.models import User
from myapp.models import Project
def users_and_projects(request):
return {'all_users': User.objects.all(),
'all_projects': Project.objects.all()}
And then add this processor to the TEMPLATE_CONTEXT_PROCESSORS
setting for Django version < 1.8:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.users_and_projects',
)
And for Django version >= 1.8 add it to the context_processors
list in the OPTIONS
of the TEMPLATES
setting:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.users_and_projects',
],
},
},
]
Context processor will run for ALL your requests. If your want to run these queries only for views which use the base.html
rendering then the other possible solution is the custom assignment tag:
@register.assignment_tag
def get_all_users():
return User.objects.all()
@register.assignment_tag
def get_all_projects():
return Project.objects.all()
And the in your base.html
template:
{% load mytags %}
{% get_all_users as all_users %}
<ul>
{% for u in all_users %}
<li><a href="{{ u.get_absolute_url }}">{{ u }}</a></li>
{% endfor %}
</ul>
{% get_all_projects as all_projects %}
<ul>
{% for p in all_projects %}
<li><a href="{{ p.get_absolute_url }}">{{ p }}</a></li>
{% endfor %}
</ul>