Kaydet (Commit) 6bfd864f authored tarafından Tommy Beadle's avatar Tommy Beadle Kaydeden (comit) Tim Graham

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

üst c612786c
......@@ -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):
......
......@@ -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>`.
......
......@@ -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
^^^^^^^^^^^^^^^^^^^^^^
......
......@@ -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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment