[django]使用自定义 context processor 实现模板全局变量

本文使用的是 django 1.4.3。

写一个 context processor 函数

可以把这个函数放在项目的任何地方,本文是放在应用目录下的 context_processors.py 文件中:

from hello.models import Category


def categories(request):  # 只有一个参数(HttpRequeset 对象)
    all_categories = Category.objects.all()
    context = {'categories': all_categories}

    return context  # 返回值必须是个字典

注意:context processor 函数只有一个参数,即 HttpRequest 对象,并且函数的返回值必须是个字典。

修改 settings 文件

修改 TEMPLATE_CONTEXT_PROCESSORS 选项值,添加新建的 context processor 函数。 如果没有 TEMPLATE_CONTEXT_PROCESSORS 这一项的话,需要把它添加到 settings 文件中。 各版本的 django 的 TEMPLATE_CONTEXT_PROCESSORS 的默认值不一样,具体见 TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.tz',
    'django.contrib.messages.context_processors.messages',
    'hello.context_processors.categories',  # 自定义的 context processors 函数
)

在 views 中使用

from django.template import RequestContext
from django.template import loader


# 第一种用法
def index(request):
    return render_to_response('index.html', {'foo': 'bar'},
                              context_instance=RequestContext(request))

# 第二种用法
def hello(request):
    t = loader.get_template('index.html')
    c = RequestContext(request, {'foo': 'bar'})
    return HttpResponse(t.render(c))

模板中使用定义的变量

Categories:
<ul>
  {# 自定义的 context processor 函数的返回值是:{'categories': all_categories},该字典的 key 可以直接在模板中作为变量使用 #}
  {% for category in categories %}
    <li>{{ category.title }}</li>
  {% endfor %}
</ul>

结果:

Categories:

  • python
  • django

示例项目下载:mysite.tar.gz,django 版本:1.4.3。

参考


Comments