diff --git a/django/template/context.py b/django/template/context.py index 778a83d7a3e..2926cec30ad 100644 --- a/django/template/context.py +++ b/django/template/context.py @@ -226,7 +226,13 @@ class RequestContext(Context): self.request = request self._processors = () if processors is None else tuple(processors) self._processors_index = len(self.dicts) - self.update({}) # placeholder for context processors output + + # placeholder for context processors output + self.update({}) + + # empty dict for any new modifications + # (so that context processors don't overwrite them) + self.update({}) @contextmanager def bind_template(self, template): diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt index d965630c77e..5adea05dd12 100644 --- a/docs/releases/1.8.3.txt +++ b/docs/releases/1.8.3.txt @@ -22,3 +22,6 @@ Bugfixes * Reverted an optimization to the CSRF template context processor which caused a regression (:ticket:`24836`). + +* Fixed a regression which caused template context processors to overwrite + variables set on a ``RequestContext`` after it's created (:ticket:`24847`). diff --git a/tests/template_tests/test_context.py b/tests/template_tests/test_context.py index 9440f218cda..d07edd3ef1f 100644 --- a/tests/template_tests/test_context.py +++ b/tests/template_tests/test_context.py @@ -2,7 +2,7 @@ from django.http import HttpRequest from django.template import ( - Context, Engine, RequestContext, Variable, VariableDoesNotExist, + Context, Engine, RequestContext, Template, Variable, VariableDoesNotExist, ) from django.template.context import RenderContext from django.test import RequestFactory, SimpleTestCase @@ -153,8 +153,8 @@ class RequestContextTests(SimpleTestCase): request = RequestFactory().get('/') ctx = RequestContext(request, {}) # The stack should now contain 3 items: - # [builtins, supplied context, context processor] - self.assertEqual(len(ctx.dicts), 3) + # [builtins, supplied context, context processor, empty dict] + self.assertEqual(len(ctx.dicts), 4) def test_context_comparable(self): # Create an engine without any context processors. @@ -168,3 +168,10 @@ class RequestContextTests(SimpleTestCase): RequestContext(request, dict_=test_data), RequestContext(request, dict_=test_data), ) + + def test_modify_context_and_render(self): + template = Template('{{ foo }}') + request = RequestFactory().get('/') + context = RequestContext(request, {}) + context['foo'] = 'foo' + self.assertEqual(template.render(context), 'foo')