diff --git a/django/views/generic/date_based.py b/django/views/generic/date_based.py
index 75094aa..2795833 100644
--- a/django/views/generic/date_based.py
+++ b/django/views/generic/date_based.py
@@ -5,8 +5,10 @@ from django.template import loader, RequestContext
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.xheaders import populate_xheaders
 from django.db.models.fields import DateTimeField
+from django.db.models.query import DateQuerySet
 from django.http import Http404, HttpResponse
 from django.utils import timezone
+from django.utils.functional import lazy
 
 import warnings
 warnings.warn(
@@ -33,11 +35,14 @@ def archive_index(request, queryset, date_field, num_latest=15,
     model = queryset.model
     if not allow_future:
         queryset = queryset.filter(**{'%s__lte' % date_field: timezone.now()})
-    date_list = queryset.dates(date_field, 'year')[::-1]
-    if not date_list and not allow_empty:
+    date_list = lazy(
+        lambda: queryset.dates(date_field, 'year')[::-1],
+        list, DateQuerySet
+    )()
+    if not (queryset.count() or allow_empty):
         raise Http404("No %s available" % model._meta.verbose_name)
 
-    if date_list and num_latest:
+    if queryset.count() and num_latest:
         latest = queryset.order_by('-'+date_field)[:num_latest]
     else:
         latest = None
diff --git a/django/views/generic/dates.py b/django/views/generic/dates.py
index 5f5f959..4ca7ad7 100644
--- a/django/views/generic/dates.py
+++ b/django/views/generic/dates.py
@@ -4,6 +4,7 @@ from django.core.exceptions import ImproperlyConfigured
 from django.http import Http404
 from django.utils.encoding import force_unicode
 from django.utils.translation import ugettext as _
+from django.utils.functional import lazy
 from django.utils import timezone
 from django.views.generic.base import View
 from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResponseMixin
@@ -203,19 +204,24 @@ class BaseDateListView(MultipleObjectMixin, DateMixin, View):
 
     def get_date_list(self, queryset, date_type):
         """
-        Get a date list by calling `queryset.dates()`, checking along the way
-        for empty lists that aren't allowed.
+        Get lazily a date list by calling `queryset.dates()`, checking along
+        the way for empty lists that aren't allowed. 
         """
         date_field = self.get_date_field()
         allow_empty = self.get_allow_empty()
 
         date_list = queryset.dates(date_field, date_type)[::-1]
-        if date_list is not None and not date_list and not allow_empty:
+        if not (queryset.count() or allow_empty):
             name = force_unicode(queryset.model._meta.verbose_name_plural)
             raise Http404(_(u"No %(verbose_name_plural)s available") %
                           {'verbose_name_plural': name})
 
-        return date_list
+
+        return lazy(
+            lambda: queryset.dates(date_field, date_type)[::-1],
+            list, models.query.DateQuerySet
+        )()
+
 
     def get_context_data(self, **kwargs):
         """
@@ -242,7 +248,7 @@ class BaseArchiveIndexView(BaseDateListView):
         qs = self.get_dated_queryset()
         date_list = self.get_date_list(qs, 'year')
 
-        if date_list:
+        if qs.count():
             object_list = qs.order_by('-' + self.get_date_field())
         else:
             object_list = qs.none()
diff --git a/tests/regressiontests/generic_views/dates.py b/tests/regressiontests/generic_views/dates.py
index 652f66b..034cc85 100644
--- a/tests/regressiontests/generic_views/dates.py
+++ b/tests/regressiontests/generic_views/dates.py
@@ -4,6 +4,7 @@ import datetime
 
 from django.core.exceptions import ImproperlyConfigured
 from django.test import TestCase
+from django.utils.functional import Promise
 
 from .models import Book
 
@@ -23,6 +24,7 @@ class ArchiveIndexViewTests(TestCase):
     def test_archive_view(self):
         res = self.client.get('/dates/books/')
         self.assertEqual(res.status_code, 200)
+        assert isinstance(res.context['date_list'], Promise)
         self.assertEqual(res.context['date_list'], Book.objects.dates('pubdate', 'year')[::-1])
         self.assertEqual(list(res.context['latest']), list(Book.objects.all()))
         self.assertTemplateUsed(res, 'generic_views/book_archive.html')
diff --git a/tests/regressiontests/views/generic_urls.py b/tests/regressiontests/views/generic_urls.py
index 40a6c01..6385601 100644
--- a/tests/regressiontests/views/generic_urls.py
+++ b/tests/regressiontests/views/generic_urls.py
@@ -26,6 +26,15 @@ numeric_days_info_dict = dict(date_based_info_dict, day_format='%d')
 
 date_based_datefield_info_dict = dict(date_based_info_dict, queryset=DateArticle.objects.all())
 
+archive_index_info_dict = dict(
+    allow_future=True, **date_based_info_dict
+)
+del archive_index_info_dict['month_format']
+
+archive_index_disallow_empty_info_dict = dict(
+    allow_empty=False, **archive_index_info_dict
+)
+
 urlpatterns = patterns('',
     (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
     (r'^accounts/logout/$', 'django.contrib.auth.views.logout'),
@@ -37,6 +46,10 @@ urlpatterns = patterns('',
 
 # Date-based generic views.
 urlpatterns += patterns('django.views.generic.date_based',
+    (r'^date_based/archive_index/$', 'archive_index',
+        archive_index_disallow_empty_info_dict),
+    (r'^date_based/archive_index/allow_empty/$', 'archive_index',
+        archive_index_info_dict),
     (r'^date_based/object_detail/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
         'object_detail',
         dict(slug_field='slug', **date_based_info_dict)),
diff --git a/tests/regressiontests/views/tests/__init__.py b/tests/regressiontests/views/tests/__init__.py
index 04537a2..132fb77 100644
--- a/tests/regressiontests/views/tests/__init__.py
+++ b/tests/regressiontests/views/tests/__init__.py
@@ -6,7 +6,7 @@ from .debug import (DebugViewTests, ExceptionReporterTests,
 from .defaults import DefaultsTests
 from .generic.create_update import (UpdateDeleteObjectTest, CreateObjectTest,
     PostSaveRedirectTests, NoPostSaveNoAbsoluteUrl, AbsoluteUrlNoPostSave)
-from .generic.date_based import MonthArchiveTest, ObjectDetailTest, DayArchiveTests
+from .generic.date_based import ArchiveIndexTest, MonthArchiveTest, ObjectDetailTest, DayArchiveTests
 from .generic.object_list import ObjectListTest
 from .generic.simple import RedirectToTest
 from .i18n import JsI18NTests, I18NTests, JsI18NTestsMultiPackage
diff --git a/tests/regressiontests/views/tests/generic/date_based.py b/tests/regressiontests/views/tests/generic/date_based.py
index 96555e5..de19f10 100644
--- a/tests/regressiontests/views/tests/generic/date_based.py
+++ b/tests/regressiontests/views/tests/generic/date_based.py
@@ -5,6 +5,39 @@ from django.test import TestCase
 from datetime import datetime, date
 from datetime import timedelta
 from regressiontests.views.models import Article, Author, DateArticle
+from django.utils.functional import Promise
+
+class ArchiveIndexTest(TestCase):
+    fixtures=['testdata.json']
+    urls = 'regressiontests.views.generic_urls'
+
+    def setUp(self):
+        self.save_warnings_state()
+        warnings.filterwarnings('ignore', category=DeprecationWarning,
+                                module='django.views.generic.date_based')
+
+    def tearDown(self):
+        self.restore_warnings_state()
+
+    def test_get_archive_view(self):
+        res = self.client.get('/date_based/archive_index/')
+        assert isinstance(res.context['date_list'], Promise)
+        self.assertEqual(
+            res.context['date_list'],
+            Article.objects.dates('date_created', 'year')[::-1]
+        )
+
+    def test_empty_archive_view(self):
+        Article.objects.all().delete()
+        res = self.client.get('/date_based/archive_index/')
+        self.assertEqual(res.status_code, 404)
+
+    def test_allow_empty_archive_view(self):
+        Article.objects.all().delete()
+        res = self.client.get('/date_based/archive_index/allow_empty/')
+        self.assertEqual(res.status_code, 200)
+        self.assertEqual(list(res.context['date_list']), [])
+        self.assertTemplateUsed(res, 'views/article_archive.html')
 
 class ObjectDetailTest(TestCase):
     fixtures = ['testdata.json']
diff --git a/tests/templates/views/article_archive.html b/tests/templates/views/article_archive.html
new file mode 100644
index 0000000..bd2d67f
--- /dev/null
+++ b/tests/templates/views/article_archive.html
@@ -0,0 +1 @@
+This template intentionally left blank
