summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Marczewski <pwmarcz@gmail.com>2015-05-26 21:38:01 +0200
committerTim Graham <timograham@gmail.com>2015-05-27 10:04:57 -0400
commit300e8baf9429dbf1c5dff478558d793638dc2f54 (patch)
tree28b902acc4c017eb77d911e2cae2d55574873f81
parent70be31bba7f8658f17235e33862319780c3dfad1 (diff)
Fixed #24847 -- Prevented items set on a RequestContext from being lost.
-rw-r--r--django/template/context.py8
-rw-r--r--docs/releases/1.8.3.txt3
-rw-r--r--tests/template_tests/test_context.py13
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')