为所有视图提供额外的上下文

eyk*_*nal 12 django django-views django-class-based-views

我正在使用django为我的团队组建一个项目管理网站.我的基本模板包括一个侧边栏菜单,其中包含所有项目和用户的列表DetailView,分别链接到该用户或项目的a .

我的问题是我需要为每个视图提供UserProject模型,以便我可以渲染该侧边栏.我知道如何添加额外的上下文 ; 问题是我觉得我通过修改每个级别的上下文来违反DRY.是否有可能重新定义简单的底座TemplateClass,使所有儿童类- ListView,DetailView等,含有改性方面?

在相关的说明中,如果这是设置项目的可怕方式,请告诉我.

cat*_*ran 20

您可以使用模板上下文处理器:

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()}
Run Code Online (Sandbox Code Playgroud)

然后将此处理器添加到以下TEMPLATE_CONTEXT_PROCESSORS设置:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.users_and_projects',
)
Run Code Online (Sandbox Code Playgroud)

上下文处理器将针对您的所有请求运行.如果您只想为使用base.html渲染的视图运行这些查询,那么另一个可能的解决方案是自定义赋值标记:

@register.assignment_tag
def get_all_users():
    return User.objects.all()

@register.assignment_tag
def get_all_projects():
    return Project.objects.all()
Run Code Online (Sandbox Code Playgroud)

在你的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>
Run Code Online (Sandbox Code Playgroud)

  • 从Django 1.8开始,上下文处理器被添加到[TEMPLATES设置](https://docs.djangoproject.com/en/2.0/ref/settings/#templates)```TEMPLATES = [{'OPTIONS':{'context_processors ':[...]}}]``` (4认同)