Django,全局模板变量

Hel*_*nar 19 django django-templates

我有一个基本模板文件(base.html),每个其他模板都扩展到它,并使用其块生成内容.某些变量(例如nav_obj)用于基本模板文件中.

视图:

nav_obj = NavigationObject.objects.all()
Run Code Online (Sandbox Code Playgroud)

基本模板:

{% for object in nav_obj %}
<a href="{{ object.link }}">{{ object.title }}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

目前,我需要在每个视图中传递nav_obj.有没有办法自动发送?

Ign*_*ams 25

编写自己的上下文处理器.

  • 谢谢!详情如下:http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/ (3认同)
  • 我有一个关于 Django 视图中全局变量的问题。可以请提供您的意见吗?http://stackoverflow.com/questions/39490843/django-app-level-variables (2认同)

spe*_*man 6

包含标记可能是上下文处理器的一个好看的替代品.


Iro*_*arf 6

正如已接受的答案已经说过的那样,使用上下文处理器。以下是如何让它们与当前 Django 版本一起工作:

首先,创建一个接受请求并返回包含全局模板变量的字典的函数:

def load_nav_obj(request):
    nav_obj = NavigationObject.objects.all()
    return {'nav_obj': nav_obj}
Run Code Online (Sandbox Code Playgroud)

此函数的最佳位置是在context_processors.py主应用程序的文件中。

现在,告诉您的应用程序对所有呈现的模板使用此上下文处理器。在您的 中 settings.py,添加myapp.context_processors.load_nav_obj设置TEMPLATE

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # Insert your context processors here
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                ...
                'myapp.context_processors.load_nav_obj',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

就是这样!{{nav_obj}}您现在可以在所有模板中使用该变量!