【问题标题】:Provide extra context to all views为所有视图提供额外的上下文
【发布时间】:2021-11-20 05:38:45
【问题描述】:

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

我的问题是我需要为每个视图提供UserProject 模型,以便我可以渲染那个侧边栏。我知道怎么add extra context;问题是我觉得我通过修改每个级别的上下文来违反 DRY。是否可以简单地重新定义基础 TemplateClass 以便所有子类(ListViewDetailView 等)包含修改后的上下文?

在相关说明中,如果这是一种糟糕的项目设置方式,请告诉我。

【问题讨论】:

    标签: django django-views django-class-based-views


    【解决方案1】:

    你可以使用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>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2013-05-21
    • 2013-01-26
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多