mirror of https://github.com/django/django.git
Fixed #24603 -- Allowed Context.update() to be used as a context manager.
This commit is contained in:
parent
c612786cf1
commit
6bfd864ff2
|
@ -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):
|
||||||
|
|
|
@ -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>`.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue