Я использую django 1.4 и пытаюсь преобразовать код, описанный в конце this article, в customtag. Это означает, что мне нужен доступ к значениям is_secure и site_name из запроса. Вот мои CONTEXT_PROCESSORS в settings.py:django custom templatetag не получает запрос в контексте
CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
)
Вот мой код шаблона Тег:
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def full_static_url(context, url):
request = context['request']
scheme = 'http'
if request.is_secure:
scheme += 's'
return scheme + '://' + request.site_name + context['STATIC_URL'] + url
На мой взгляд, кода я использую новый ярлык рендеринга следующим образом:
return render(request, 'myapp/mytemplate.html', {'foo':bar})
И я вызываю его вот так в шаблоне:
{% full_static_url "images/logo.gif" %}
Проблема в том, что когда она добирается до строки request = context ['request'], она выдает KeyError, потому что «запрос» не находится в контексте.
Что я здесь делаю неправильно?
Полный отслеживающий является:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "C:\Projects\blah\blah\myapp\views\myview.py" in manifestcosts
44. return render(request, 'myapp/mytemplate.html', {'foo':bar})
File "C:\Python27\lib\site-packages\django\shortcuts\__init__.py" in render
44. return HttpResponse(loader.render_to_string(*args, **kwargs),
File "C:\Python27\lib\site-packages\django\template\loader.py" in render_to_string
176. return t.render(context_instance)
File "C:\Python27\lib\site-packages\django\template\base.py" in render
140. return self._render(context)
File "C:\Python27\lib\site-packages\django\template\base.py" in _render
134. return self.nodelist.render(context)
File "C:\Python27\lib\site-packages\django\template\base.py" in render
823. bit = self.render_node(node, context)
File "C:\Python27\lib\site-packages\django\template\debug.py" in render_node
74. return node.render(context)
File "C:\Python27\lib\site-packages\django\template\defaulttags.py" in render
185. nodelist.append(node.render(context))
File "C:\Python27\lib\site-packages\django\template\base.py" in render
1107. return func(*resolved_args, **resolved_kwargs)
File "C:\Projects\blah\blah\myapp\templatetags\mytags.py" in full_static_url
25. request = context['request'] #TODO this fails with an KeyError, don't know why
File "C:\Python27\lib\site-packages\django\template\context.py" in __getitem__
54. raise KeyError(key)
Exception Type: KeyError at /myapp/myurl/110505081136179000/
Exception Value: 'request'
Попробуйте это. http://squeeville.com/2009/01/27/django-templatetag-requestcontext-and-inclusion_tag/ – CppLearner
@CppLearner Я попробовал, но, как я подозревал, та же проблема. KeyError, когда он пытается получить запрос из контекстной карты. – ThatAintWorking
Как и в случае проверки работоспособности, у вас есть действительно CONTEXT_PROCESSORS или лучший вариант TEMPLATE_CONTEXT_PROCESSORS в ваших настройках.py? – loomi