3

私はdjango1.4を使用しており、この記事の最後に記載されているコードをカスタムタグに変換しようとしています。これは、リクエストから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']に到達すると、' 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'
4

4 に答える 4

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'] を 2 回追加する必要がありましたが、問題なく動作しているようです


編集:私はあまりにも早く話しました。空白のコンテキストを修正できないようです。代わりに、回避策を試すことができます。

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

私のページはまだ正常に動作しているように見えるので、これらの悪いコンテキストがどこから来ているのか正確にはわかりません.

于 2013-01-15T05:45:48.760 に答える