2010-02-11 47 views
59

我有一个奇怪的问题,我想使用上下文处理器添加一个全局查询。 这是我做到了由followingDjango,模板上下文处理器

在我的应用取得了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和其他内容都没有了。 什么可问题

回答

53

指定此:

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

在你的设置文件,要覆盖Django的default context processors。为了延长列表中,你需要在你的设置中默认的:

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

+0

我奇怪地没有TEMPLATE_CONTEXT_PROCESSORS在我的settings.py,使用默认的Django 1.1.1和MEDIA_URL被罚款早期工作。 – Hellnar 2010-02-11 18:37:02

+5

这是因为如果你没有指定它,它会使用djangos设置中指定的默认值。这就是所有django设置的工作原理,它们有一个默认值,如果你没有在'settings.py'中设置它,就会使用它。 – 2010-02-11 18:37:55

+0

感谢您的工作!所以我删除“django.contrib.messages.context_processors.messages”我得到的错误, 我认为这是Django的开发版本,而不是1.1.1 – Hellnar 2010-02-11 18:41:02

6

这里什么工作对我来说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",) 
173

您需要添加TEMPLATE_CONTEXT_PROCESSORS的默认值。然而,而不是硬编码的值,这将被捆绑到Django的特定版本,您可以通过下面的附加您的上下文处理器的默认值:

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

请务必保留后面的逗号元组,以便Python将其识别为元组。

+2

感谢您的提示!它比人们提出的比较典型的解决方案好得多,比如TM在这里的答案。不得不指定一组默认值来添加一个,总是让我觉得这是一个混乱,当然,当我升级到django 1.3并且因为缺少默认的静态上下文处理器而无法工作时,它就回到了我的身上。 – 2012-05-16 20:51:39

+8

这是更好的答案,因为如果默认处理器更改,它仍然可以工作。 – Canuck 2012-09-05 10:58:11

+2

@Greg格洛克纳这是一个很棒的提示,但我应该在哪里添加代码? 'settings.py'? – dialex 2013-06-22 14:56:27

相关问题