#27722: if a template context is an instance of get_template(), it will raise
"TypeError: context must be a dict rather than RequestContext"
-------------------------------------------+------------------------
Reporter: Sayid Munawar | Owner: nobody
Type: Bug | Status: new
Component: Template system | Version: master
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------------+------------------------
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
[https://github.com/django/django/blob/ecb59cc6579402b68ddfd4499bf30edacf5963be/django/template/backends/django.py#L63
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)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/27722>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/050.3f6826d7672d353b6ee705c0aadf3f60%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.