为所有视图提供额外的上下文
Provide extra context to all views
我正在使用 django 为我的团队构建一个项目管理网站。我的基本模板包括一个侧边栏菜单,其中包含所有项目和用户的列表,分别链接到该用户或项目的 DetailView
。
我的问题是我需要为每个视图提供 User
和 Project
模型,以便我可以呈现侧边栏。我知道如何 add extra context;问题是我觉得我通过修改每个级别的上下文来违反 DRY。是否可以简单地重新定义基础 TemplateClass
,以便所有子 类—ListView
、DetailView
等—包含修改后的上下文?
相关说明,如果这是设置项目的糟糕方式,请也告诉我。
您可以使用 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 版本 <1.8 的 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>
我正在使用 django 为我的团队构建一个项目管理网站。我的基本模板包括一个侧边栏菜单,其中包含所有项目和用户的列表,分别链接到该用户或项目的 DetailView
。
我的问题是我需要为每个视图提供 User
和 Project
模型,以便我可以呈现侧边栏。我知道如何 add extra context;问题是我觉得我通过修改每个级别的上下文来违反 DRY。是否可以简单地重新定义基础 TemplateClass
,以便所有子 类—ListView
、DetailView
等—包含修改后的上下文?
相关说明,如果这是设置项目的糟糕方式,请也告诉我。
您可以使用 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 版本 <1.8 的 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>