Provide extra context to all views

*爱你&永不变心* 提交于 2019-11-30 12:18:22

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:

TEMPLATE_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>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!