Index: django/template/base.py
===================================================================
--- django/template/base.py	(revision 16741)
+++ django/template/base.py	(working copy)
@@ -672,10 +672,13 @@
         detail and shouldn't be called by external code. Use Variable.resolve()
         instead.
         """
+        from collections import defaultdict
         current = context
         try: # catch-all for silent variable failures
             for bit in self.lookups:
                 try: # dictionary lookup
+                    if isinstance(current, defaultdict):
+                        current = dict(current)
                     current = current[bit]
                 except (TypeError, AttributeError, KeyError):
                     try: # attribute lookup
Index: tests/regressiontests/templates/context.py
===================================================================
--- tests/regressiontests/templates/context.py	(revision 16741)
+++ tests/regressiontests/templates/context.py	(working copy)
@@ -1,5 +1,5 @@
 # coding: utf-8
-from django.template import Context
+from django.template import Context, Variable
 from django.utils.unittest import TestCase
 
 
@@ -14,3 +14,11 @@
         self.assertEqual(c.pop(), {"a": 2})
         self.assertEqual(c["a"], 1)
         self.assertEqual(c.get("foo", 42), 42)
+    def test_defaultdict_conversion(self):
+        from collections import defaultdict
+        dd = defaultdict(list)
+        dd['a'].extend([1, 2, 3, 4])
+        dd['b'].extend([5, 6, 7, 8])
+        context = Context({'dd': dd})
+        var = Variable('dd.items')
+        self.assertEqual(dd.items(), var.resolve(context))
