diff options
| author | Paweł Marczewski <pwmarcz@gmail.com> | 2015-05-26 21:38:01 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-05-27 10:04:57 -0400 |
| commit | 300e8baf9429dbf1c5dff478558d793638dc2f54 (patch) | |
| tree | 28b902acc4c017eb77d911e2cae2d55574873f81 | |
| parent | 70be31bba7f8658f17235e33862319780c3dfad1 (diff) | |
Fixed #24847 -- Prevented items set on a RequestContext from being lost.
| -rw-r--r-- | django/template/context.py | 8 | ||||
| -rw-r--r-- | docs/releases/1.8.3.txt | 3 | ||||
| -rw-r--r-- | tests/template_tests/test_context.py | 13 |
3 files changed, 20 insertions, 4 deletions
diff --git a/django/template/context.py b/django/template/context.py index 778a83d7a3..2926cec30a 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 d965630c77..5adea05dd1 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 9440f218cd..d07edd3ef1 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') |
