Django 1.4:为什么我的上下文处理器不工作?

时间:2012-08-19 13:02:27

标签: django django-templates django-1.4

我最近将一个项目从Django 1.3升级到1.4,这似乎打破了我的上下文处理器。

myapp/myapp/processors.py

def currentPath(request):
    return {'current_path': request.get_full_path()}

myapp/myapp/settings.py

from django.conf import global_settings

global_settings.TEMPLATE_CONTEXT_PROCESSORS += (
    'myapp.processors.currentPath',
    'django.core.context_processors.request',
)

在任何模板中,都需要{{ current_path }} - 在升级之前,它会返回当前路径。现在,它根本没有得到处理。我完全被困在这里。

4 个答案:

答案 0 :(得分:4)

只是为了踢,你会考虑指定设置通常的方式:

- global_settings.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.contrib.messages.context_processors.messages',
     'myapp.processors.currentPath',
     'django.core.context_processors.request',
 )

这可能会消除您对global_settings的{​​(有用的!)引用作为问题的来源。

其次,如果你运行

manage.py shell

确实

from myapp.processors import currentPath

工作?您的项目结构看起来很古怪(我之前没有在settings.py的同一目录中看到上下文处理器;我的context.pymodels.py位于同一目录中,我理解通常不应与settings.py)目录相同。

(根据OP的要求从评论转换为答案)

答案 1 :(得分:4)

Django 1.8中添加处理器TEMPLATE_CONTEXT_PROCESSORS无法正常工作。

Deprecated since version 1.8:
Set the 'context_processors' option in the OPTIONS of a DjangoTemplates backend instead.

你必须这样做:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            # insert your TEMPLATE_DIRS here
        ],
        'OPTIONS': {
            'context_processors': [
                # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
                # list if you haven't customized them:
                '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',
                'django.contrib.messages.context_processors.messages',
            ],
            'loaders': [
                # insert your TEMPLATE_LOADERS here
            ]
        },
    },
]

答案 2 :(得分:2)

你应该返回dict:

def currentPath(request):
    return {'current_path': request.get_full_path()}

答案 3 :(得分:1)

您需要为要处理的上下文处理器包含RequestContext

您可以使用render快捷方式自动将其包含在内:

from django.shortcuts import render

def my_view(request):
   context = {}
   return render(request, 'mytemplate.html', context)

如果您使用的是基于分类的观看次数,则RequestContext会自动加入。