Commit 7ee6043d authored by Paweł Marczewski's avatar Paweł Marczewski Committed by Tim Graham
Browse files

Fixed #24847 -- Prevented items set on a RequestContext from being lost.

Backport of 300e8baf from master
parent d4115868
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -219,7 +219,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):
+3 −0
Original line number Diff line number Diff line
@@ -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`).
+9 −2
Original line number Diff line number Diff line
@@ -134,8 +134,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.
@@ -149,3 +149,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')