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

This commit is contained in:
Tommy Beadle 2015-04-13 10:57:44 -04:00 committed by Tim Graham
parent c612786cf1
commit 6bfd864ff2
4 changed files with 32 additions and 2 deletions

View File

@ -171,8 +171,7 @@ class Context(BaseContext):
"Pushes other_dict to the stack of dictionaries in the Context" "Pushes other_dict to the stack of dictionaries in the Context"
if not hasattr(other_dict, '__getitem__'): if not hasattr(other_dict, '__getitem__'):
raise TypeError('other_dict must be a mapping (dictionary-like) object.') raise TypeError('other_dict must be a mapping (dictionary-like) object.')
self.dicts.append(other_dict) return ContextDict(self, other_dict)
return other_dict
class RenderContext(BaseContext): class RenderContext(BaseContext):

View File

@ -497,6 +497,21 @@ the stack instead of an empty one.
>>> c['foo'] >>> c['foo']
'first level' '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 Using a ``Context`` as a stack comes in handy in :ref:`some custom template
tags <howto-writing-custom-template-tags>`. tags <howto-writing-custom-template-tags>`.

View File

@ -211,6 +211,9 @@ Templates
* The :ttag:`firstof` template tag supports storing the output in a variable * The :ttag:`firstof` template tag supports storing the output in a variable
using 'as'. using 'as'.
* :meth:`Context.update() <django.template.Context.update>` can now be used as
a context manager.
Requests and Responses Requests and Responses
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^

View File

@ -21,6 +21,8 @@ class ContextTests(SimpleTestCase):
self.assertEqual(c["a"], 1) self.assertEqual(c["a"], 1)
self.assertEqual(c.get("foo", 42), 42) self.assertEqual(c.get("foo", 42), 42)
def test_push_context_manager(self):
c = Context({"a": 1})
with c.push(): with c.push():
c['a'] = 2 c['a'] = 2
self.assertEqual(c['a'], 2) self.assertEqual(c['a'], 2)
@ -30,6 +32,17 @@ class ContextTests(SimpleTestCase):
self.assertEqual(c['a'], 3) self.assertEqual(c['a'], 3)
self.assertEqual(c['a'], 1) 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): def test_setdefault(self):
c = Context() c = Context()