Commit 6bfd864f authored by Tommy Beadle's avatar Tommy Beadle Committed by Tim Graham
Browse files

Fixed #24603 -- Allowed Context.update() to be used as a context manager.

parent c612786c
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -171,8 +171,7 @@ class Context(BaseContext):
        "Pushes other_dict to the stack of dictionaries in the Context"
        if not hasattr(other_dict, '__getitem__'):
            raise TypeError('other_dict must be a mapping (dictionary-like) object.')
        self.dicts.append(other_dict)
        return other_dict
        return ContextDict(self, other_dict)


class RenderContext(BaseContext):
+15 −0
Original line number Diff line number Diff line
@@ -497,6 +497,21 @@ the stack instead of an empty one.
    >>> c['foo']
    'first level'

Like ``push()``, you can use ``update()`` as a context manager to ensure a
matching ``pop()`` is called.

    >>> c = Context()
    >>> c['foo'] = 'first level'
    >>> with c.update({'foo': 'second level'}):
    ...     c['foo']
    'second level'
    >>> c['foo']
    'first level'

.. versionadded:: 1.9

    The ability to use ``update()`` as a context manager was added.

Using a ``Context`` as a stack comes in handy in :ref:`some custom template
tags <howto-writing-custom-template-tags>`.

+3 −0
Original line number Diff line number Diff line
@@ -211,6 +211,9 @@ Templates
* The :ttag:`firstof` template tag supports storing the output in a variable
  using 'as'.

* :meth:`Context.update() <django.template.Context.update>` can now be used as
  a context manager.

Requests and Responses
^^^^^^^^^^^^^^^^^^^^^^

+13 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ class ContextTests(SimpleTestCase):
        self.assertEqual(c["a"], 1)
        self.assertEqual(c.get("foo", 42), 42)

    def test_push_context_manager(self):
        c = Context({"a": 1})
        with c.push():
            c['a'] = 2
            self.assertEqual(c['a'], 2)
@@ -30,6 +32,17 @@ class ContextTests(SimpleTestCase):
            self.assertEqual(c['a'], 3)
        self.assertEqual(c['a'], 1)

    def test_update_context_manager(self):
        c = Context({"a": 1})
        with c.update({}):
            c['a'] = 2
            self.assertEqual(c['a'], 2)
        self.assertEqual(c['a'], 1)

        with c.update({'a': 3}):
            self.assertEqual(c['a'], 3)
        self.assertEqual(c['a'], 1)

    def test_setdefault(self):
        c = Context()