diff --git a/django/template/context.py b/django/template/context.py index af4fb8853b..2c30181927 100644 --- a/django/template/context.py +++ b/django/template/context.py @@ -89,6 +89,13 @@ class BaseContext(object): return d[key] return otherwise + def setdefault(self, key, default=None): + try: + return self[key] + except KeyError: + self[key] = default + return default + def new(self, values=None): """ Returns a new context with the same properties, but with only the diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt index 05a6539988..b8e74b75ec 100644 --- a/docs/ref/templates/api.txt +++ b/docs/ref/templates/api.txt @@ -420,6 +420,13 @@ dictionary syntax:: Returns the value for ``key`` if ``key`` is in the context, else returns ``otherwise``. +.. method:: Context.setdefault(key, default=None) + + .. versionadded:: 1.9 + + If ``key`` is in the context, returns its value. Otherwise inserts ``key`` + with a value of ``default`` and returns ``default``. + .. method:: Context.pop() .. method:: Context.push() .. exception:: ContextPopException diff --git a/docs/releases/1.9.txt b/docs/releases/1.9.txt index 08d79cb59a..4375ba2a0d 100644 --- a/docs/releases/1.9.txt +++ b/docs/releases/1.9.txt @@ -166,6 +166,9 @@ Templates helper can now store results in a template variable by using the ``as`` argument. +* Added a :meth:`Context.setdefault() <django.template.Context.setdefault>` + method. + Requests and Responses ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/template_tests/test_context.py b/tests/template_tests/test_context.py index 8331904f64..9c23a38af2 100644 --- a/tests/template_tests/test_context.py +++ b/tests/template_tests/test_context.py @@ -30,6 +30,17 @@ class ContextTests(SimpleTestCase): self.assertEqual(c['a'], 3) self.assertEqual(c['a'], 1) + def test_setdefault(self): + c = Context() + + x = c.setdefault('x', 42) + self.assertEqual(x, 42) + self.assertEqual(c['x'], 42) + + x = c.setdefault('x', 100) + self.assertEqual(x, 42) + self.assertEqual(c['x'], 42) + def test_resolve_on_context_method(self): """ #17778 -- Variable shouldn't resolve RequestContext methods