你可以使用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()}
然后将此处理器添加到 Django 版本 TEMPLATE_CONTEXT_PROCESSORS 设置:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.users_and_projects',
)
对于 Django 版本 >= 1.8 将其添加到 TEMPLATES 设置的 OPTIONS 中的 context_processors 列表中:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.users_and_projects',
],
},
},
]
上下文处理器将为您的所有请求运行。如果您只想为使用base.html 渲染的视图运行这些查询,那么另一个可能的解决方案是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()
在您的base.html 模板中:
{% 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>