Opened 9 years ago
Last modified 9 years ago
#27722 closed Bug
if a template context is an instance of get_template(), it will raise "TypeError: context must be a dict rather than RequestContext" — at Initial Version
| Reported by: | Sayid Munawar | Owned by: | nobody |
|---|---|---|---|
| Component: | Template system | Version: | 1.11 |
| Severity: | Release blocker | Keywords: | |
| Cc: | FunkyBob, Aymeric Augustin | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
This simple view:
class Ngopi(TemplateView):
template_name = 'base.html'
def get_context_data(self, **kwargs):
context = super(Ngopi, self).get_context_data(**kwargs)
context.update({
'menu': get_template('menu.html')
})
return context
with base.html:
<html>
<body>
<h1>Ngeteh</h1>
{% include menu %}
</body>
</html>
and menu.html:
<ul> <li>Ngeteh</li> <li>Ngopi</li> </ul>
This situation will raise this exception:
Traceback (most recent call last):
File "/Users/ayik/Repo/Django/django/django/core/handlers/exception.py", line 38, in inner
response = get_response(request)
File "/Users/ayik/Repo/Django/django/django/core/handlers/base.py", line 217, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/ayik/Repo/Django/django/django/core/handlers/base.py", line 215, in _get_response
response = response.render()
File "/Users/ayik/Repo/Django/django/django/template/response.py", line 107, in render
self.content = self.rendered_content
File "/Users/ayik/Repo/Django/django/django/template/response.py", line 84, in rendered_content
content = template.render(context, self._request)
File "/Users/ayik/Repo/Django/django/django/template/backends/django.py", line 66, in render
return self.template.render(context)
File "/Users/ayik/Repo/Django/django/django/template/base.py", line 207, in render
return self._render(context)
File "/Users/ayik/Repo/Django/django/django/template/base.py", line 199, in _render
return self.nodelist.render(context)
File "/Users/ayik/Repo/Django/django/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/ayik/Repo/Django/django/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Users/ayik/Repo/Django/django/django/template/loader_tags.py", line 212, in render
return template.render(context)
File "/Users/ayik/Repo/Django/django/django/template/backends/django.py", line 64, in render
context = make_context(context, request, autoescape=self.backend.engine.autoescape)
File "/Users/ayik/Repo/Django/django/django/template/context.py", line 285, in make_context
raise TypeError('context must be a dict rather than %s.' % context.__class__.__name__)
TypeError: context must be a dict rather than RequestContext.
This is fine with django 1.10, but not master (mine is currently 1.11.dev20170109230310)
a quick workaround is to edit django/template/backends/django.py Line 63 to be like this:
def render(self, context=None, request=None):
if isinstance(context, dict): # <-- my temporary workaround
context = make_context(context, request, autoescape=self.backend.engine.autoescape)
try:
return self.template.render(context)
except TemplateDoesNotExist as exc:
reraise(exc, self.backend)
Note:
See TracTickets
for help on using tickets.