You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何为所有视图统一注入公共上下文数据

Django全局共享上下文数据解决方案

Django原生提供了多种成熟方案实现通用上下文数据统一注入,无需在每个视图手动传参,最常用的两种实现方式如下:

方案1:上下文处理器(全局注入推荐)

上下文处理器是Django官方设计的专门用于给所有模板自动注入通用变量的机制,完全适配你的需求:

  • 第一步:在你的应用目录下新建context_processors.py文件,写入如下逻辑:
from .models import MyModel

def nav_links_processor(request):
    # 取前5个MyModel对象的链接返回
    objects = MyModel.objects.all()[:5]
    return {"links": [o.get_absolute_url() for o in objects]}
  • 第二步:打开项目根目录的settings.py,找到TEMPLATES配置项,将你写的处理器加入上下文处理器列表:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # 新增你的自定义上下文处理器,替换为你实际的应用名
                'your_app_name.context_processors.nav_links_processor',
            ],
        },
    },
]
  • 配置完成后,所有模板都可以直接使用{{ links }}变量,你可以删除所有视图中手动传入links参数的代码。

方案2:自定义模板标签(仅部分模板使用时推荐)

如果导航栏只在部分模板中出现,不需要全局注入,可以使用自定义模板标签实现:

  • 第一步:在应用目录下新建templatetags文件夹,在文件夹内新增空文件__init__.py和标签文件nav_tags.py,写入如下逻辑:
from django import template
from ..models import MyModel

register = template.Library()

@register.simple_tag
def get_nav_links():
    objects = MyModel.objects.all()[:5]
    return [o.get_absolute_url() for o in objects]
  • 第二步:在需要用到导航栏的模板顶部加载标签并调用即可:
{% load nav_tags %}
<ul>
    {% get_nav_links as links %}
    {% for link in links %}
    <li><a href="{{ link }}"></a></li>
    {% endfor %}
</ul>

注意:你提供的示例代码存在两处语法问题:1. 模板中{% for %}循环的结束标签错写为{% endif %},应改为{% endfor %};2. 视图函数定义后缺少冒号,render方法的第一个参数request不需要加引号。

内容的提问来源于stack exchange,提问作者T'n'E

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:18:04