我最近将一个项目从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 }}
- 在升级之前,它会返回当前路径。现在,它根本没有得到处理。我完全被困在这里。
答案 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.py
与models.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
会自动加入。