python template教程 - Django,模板上下文处理器




template大于 django表格 (4)

我有一个奇怪的问题,我想使用上下文处理器添加一个全局查询。 这是我通过following做到的:

在我的应用程序中制作了processor.py:

from myproject.myapp.models import Foo

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

在我的setting.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和其他上下文已经消失。 可能是什么问题


Answers

您需要添加TEMPLATE_CONTEXT_PROCESSORS的默认值。 但是,您可以通过以下方式将上下文处理器附加到默认值,而不是硬编码那些与Django的特定版本相关联的值。

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

确保在元组中包含尾随逗号,以便Python将其识别为元组。


当你指定这个:

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的默认设置(加上你的处理器)。


这对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", )

回答你的第二个问题:完全没有区别(至少我使用的实现)。 拆解这两个语句,它们呈现为LOAD_CONST STORE_FAST 。 它们是等价的。





python django django-templates