Django,模板上下文处理器

59 投票
3 回答
42108 浏览
提问于 2025-04-15 19:10

我遇到了一个奇怪的问题,我想通过上下文处理器添加一个全局查询。

这是我按照这个链接的方法来做的:

我在我的应用里创建了一个processor.py,内容如下:

from myproject.myapp.models import Foo

def foos(request):
    return {'foos': Foo.objects.all()}

然后在我的settings.py文件的最后,我添加了这个:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)

最后,我这样传递我的视图:

def index_view(request):

    return render_to_response('index.html', {}, context_instance=RequestContext(request))

在我的index.html模板里:

<select id="select_foo">
{% for foo in foos %}
    <option value="/{{ foo.slug }}">{{ foo.name }}</option>
{% endfor %}
</select>

最后是我的网址设置:

(r'^$', 'myapp.views.index_view'),

我的foos显示得没问题,但我的media_url和其他上下文却消失了。可能是什么问题呢?

3 个回答

7

这是我在使用Django 1.3时有效的方法

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.contrib.messages.context_processors.messages",
    "myapp.processor.foos", )
177

你需要添加一些默认的值到TEMPLATE_CONTEXT_PROCESSORS里。不过,不要直接把这些值写死在代码里,因为那样会和某个特定版本的Django绑定在一起。你可以通过下面的方法,把你的上下文处理器加到默认值里:

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos",
)

记得在这个元组的最后加上一个逗号,这样Python才能把它识别为一个元组。

56

当你这样指定时:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)

在你的设置文件中,你正在覆盖Django的默认上下文处理器。如果你想要扩展这个列表,你需要在你的设置中包含默认的处理器:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "myapp.processor.foos",
)

注意,上面的设置是django 1.1的默认设置(加上你的处理器)。

撰写回答