3

我正在使用 django 1.4 并尝试将本文末尾描述的代码转换为 customtag。这意味着我需要访问请求中的 is_secure 和 site_name 值。这是我在 settings.py 中的 CONTEXT_PROCESSORS:

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 ,因为 'request' 不在上下文中。

我在这里做错了什么?

完整的追溯是:

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'
4

4 回答 4

10

解决此问题的正确方法是添加TEMPLATE_CONTEXT_PROCESSORS += ("django.core.context_processors.request",)您的 settings.py 文件。

确保先导入TEMPLATE_CONTEXT_PROCESSORSfrom django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS否则将无法正常工作。

于 2014-06-10T14:05:20.483 回答
1

最有可能的问题是您正在使用常规上下文呈现模板,就像这样:

return render_to_response("myapp/template.html", {"some_var": a_value})

请记住,上下文处理器仅适用于RequestContext实例。这意味着您必须RequestContextrender_to_response调用中显式创建 a :

return render_to_response("myapp/template.html", {"some_var": a_value},
                          context_instance=RequestContext(request))

甚至更好的是,使用新的render快捷方式:

return render(request, "myapp/template.html", {"some_var": a_value})
于 2012-04-23T22:16:33.537 回答
0

我通过改变解决了

return render(request, 'myapp/mytemplate.html', {'foo':bar})

return render( RequestContext(request), 'myapp/mytemplate.html', {'foo':bar})

我希望这对其他人有所帮助,我浪费了大约 8 个小时:p

于 2012-12-10T08:44:56.607 回答
0

我在 render() 中的 template.Node 对象中发生了这种情况。事实证明,有时上下文中有“请求”,有时则没有。

就像其他人建议的那样,RequestContext(request)是关键。我的猜测是,有时在没有像这样初始化请求的情况下调用上下文。

我改变了我的功能

 def render(self, context):
      request = context['request']  # Failing here

 def render(self, context):
      request = RequestContext(context)['request']['request']

一切顺利。

如果上下文对象未正确初始化,这将强制请求对象。出于某种原因,我不得不添加 ['request'] 两次,但它似乎工作正常


编辑:我说得太早了,似乎无法修复空白上下文。相反,您可以尝试一种解决方法:

request = context.get('request')
if request is None:
    return ''

我的页面似乎仍然可以正常工作,所以我不确定这些不好的上下文是从哪里来的。

于 2013-01-15T05:45:48.760 回答