summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/template/context.py7
-rw-r--r--docs/ref/templates/api.txt7
-rw-r--r--docs/releases/1.9.txt3
-rw-r--r--tests/template_tests/test_context.py11
4 files changed, 28 insertions, 0 deletions
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