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