Index: django/core/paginator.py
===================================================================
--- django/core/paginator.py	(revision 5992)
+++ django/core/paginator.py	(working copy)
@@ -86,3 +86,31 @@
 
     hits = property(_get_hits)
     pages = property(_get_pages)
+
+def compute_pagination(paginator, page, paginate_by, allow_empty):
+    """
+    Compute queryset considering pagination, and update the context.
+    """
+    try:
+        page = int(page)
+        queryset = paginator.get_page(page - 1)
+    except (InvalidPage, ValueError):
+        if page == 1 and allow_empty:
+            queryset = paginator.query_set.empty() 
+        else:
+            raise InvalidPage 
+
+    c = {}
+    c['is_paginated'] = paginator.pages > 1
+    c['results_per_page'] = paginate_by
+    c['has_next'] = paginator.has_next_page(page - 1)
+    c['has_previous'] = paginator.has_previous_page(page - 1)
+    c['page'] = page
+    c['next'] = page + 1
+    c['previous'] = page - 1
+    c['last_on_page'] = paginator.last_on_page(page - 1),
+    c['first_on_page'] = paginator.first_on_page(page - 1),
+    c['pages'] = paginator.pages
+    c['hits'] = paginator.hits
+
+    return (queryset, c)
Index: django/views/generic/date_based.py
===================================================================
--- django/views/generic/date_based.py	(revision 5992)
+++ django/views/generic/date_based.py	(working copy)
@@ -1,6 +1,7 @@
 from django.template import loader, RequestContext
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.xheaders import populate_xheaders
+from django.core.paginator import compute_pagination, ObjectPaginator, InvalidPage
 from django.db.models.fields import DateTimeField
 from django.http import Http404, HttpResponse
 import datetime, time
@@ -8,7 +9,7 @@
 def archive_index(request, queryset, date_field, num_latest=15,
         template_name=None, template_loader=loader,
         extra_context=None, allow_empty=False, context_processors=None,
-        mimetype=None, allow_future=False):
+        mimetype=None, allow_future=False, paginate_by=None, page=None):
     """
     Generic top-level archive of date-based objects.
 
@@ -18,6 +19,30 @@
             List of years
         latest
             Latest N (defaults to 15) objects by date
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+        last_on_page
+            the result number of the last of object in the
+            object_list (1-indexed)
+        first_on_page
+            the result number of the first object in the
+            object_list (1-indexed)
     """
     if extra_context is None: extra_context = {}
     model = queryset.model
@@ -30,8 +55,18 @@
     if date_list and num_latest:
         latest = queryset.order_by('-'+date_field)[:num_latest]
     else:
-        latest = None
+        latest = []
 
+    # Pagination.
+    pagination_context = {'is_paginated': False}
+    if paginate_by:
+        paginator = ObjectPaginator(latest, paginate_by)
+        page = page or request.GET.get('page', 1)
+        try:
+            latest, pagination_context = compute_pagination(paginator, page, paginate_by, allow_empty)
+        except InvalidPage:
+            raise Http404
+
     if not template_name:
         template_name = "%s/%s_archive.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
@@ -44,12 +79,15 @@
             c[key] = value()
         else:
             c[key] = value
+
+    c.update(pagination_context)
+
     return HttpResponse(t.render(c), mimetype=mimetype)
 
 def archive_year(request, year, queryset, date_field, template_name=None,
         template_loader=loader, extra_context=None, allow_empty=False,
         context_processors=None, template_object_name='object', mimetype=None,
-        make_object_list=False, allow_future=False):
+        make_object_list=False, allow_future=False, paginate_by=None, page=None):
     """
     Generic yearly archive view.
 
@@ -61,7 +99,33 @@
             This year
         object_list
             List of objects published in the given month
+
             (Only available if make_object_list argument is True)
+
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+        last_on_page
+            the result number of the last of object in the
+            object_list (1-indexed)
+        first_on_page
+            the result number of the first object in the
+            object_list (1-indexed)
     """
     if extra_context is None: extra_context = {}
     model = queryset.model
@@ -79,6 +143,17 @@
         object_list = queryset.filter(**lookup_kwargs).order_by(date_field)
     else:
         object_list = []
+
+    # Pagination.
+    pagination_context = {'is_paginated': False}
+    if paginate_by:
+        paginator = ObjectPaginator(object_list, paginate_by)
+        page = page or request.GET.get('page', 1)
+        try:
+            object_list, pagination_context = compute_pagination(paginator, page, paginate_by, allow_empty)
+        except InvalidPage:
+            raise Http404
+
     if not template_name:
         template_name = "%s/%s_archive_year.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
@@ -92,12 +167,16 @@
             c[key] = value()
         else:
             c[key] = value
+
+    c.update(pagination_context)
+
     return HttpResponse(t.render(c), mimetype=mimetype)
 
 def archive_month(request, year, month, queryset, date_field,
         month_format='%b', template_name=None, template_loader=loader,
         extra_context=None, allow_empty=False, context_processors=None,
-        template_object_name='object', mimetype=None, allow_future=False):
+        template_object_name='object', mimetype=None, allow_future=False,
+        paginate_by=None, page=None):
     """
     Generic monthly archive view.
 
@@ -111,6 +190,30 @@
             (date) the first day of the previous month
         object_list:
             list of objects published in the given month
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+        last_on_page
+            the result number of the last of object in the
+            object_list (1-indexed)
+        first_on_page
+            the result number of the first object in the
+            object_list (1-indexed)
     """
     if extra_context is None: extra_context = {}
     try:
@@ -144,6 +247,16 @@
     else:
         next_month = None
 
+    # Pagination.
+    pagination_context = {'is_paginated': False}
+    if paginate_by:
+        paginator = ObjectPaginator(object_list, paginate_by)
+        page = page or request.GET.get('page', 1)
+        try:
+            object_list, pagination_context = compute_pagination(paginator, page, paginate_by, allow_empty)
+        except InvalidPage:
+            raise Http404
+
     if not template_name:
         template_name = "%s/%s_archive_month.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
@@ -158,12 +271,16 @@
             c[key] = value()
         else:
             c[key] = value
+
+    c.update(pagination_context)
+
     return HttpResponse(t.render(c), mimetype=mimetype)
 
 def archive_week(request, year, week, queryset, date_field,
         template_name=None, template_loader=loader,
         extra_context=None, allow_empty=True, context_processors=None,
-        template_object_name='object', mimetype=None, allow_future=False):
+        template_object_name='object', mimetype=None, allow_future=False,
+        paginate_by=None, page=None):
     """
     Generic weekly archive view.
 
@@ -173,6 +290,30 @@
             (date) this week
         object_list:
             list of objects published in the given week
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+        last_on_page
+            the result number of the last of object in the
+            object_list (1-indexed)
+        first_on_page
+            the result number of the first object in the
+            object_list (1-indexed)
     """
     if extra_context is None: extra_context = {}
     try:
@@ -194,6 +335,17 @@
     object_list = queryset.filter(**lookup_kwargs)
     if not object_list and not allow_empty:
         raise Http404
+
+    # Pagination.
+    pagination_context = {'is_paginated': False}
+    if paginate_by:
+        paginator = ObjectPaginator(object_list, paginate_by)
+        page = page or request.GET.get('page', 1)
+        try:
+            object_list, pagination_context = compute_pagination(paginator, page, paginate_by, allow_empty)
+        except InvalidPage:
+            raise Http404
+
     if not template_name:
         template_name = "%s/%s_archive_week.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
@@ -206,13 +358,16 @@
             c[key] = value()
         else:
             c[key] = value
+
+    c.update(pagination_context)
+
     return HttpResponse(t.render(c), mimetype=mimetype)
 
 def archive_day(request, year, month, day, queryset, date_field,
         month_format='%b', day_format='%d', template_name=None,
         template_loader=loader, extra_context=None, allow_empty=False,
         context_processors=None, template_object_name='object',
-        mimetype=None, allow_future=False):
+        mimetype=None, allow_future=False, paginate_by=None, page=None):
     """
     Generic daily archive view.
 
@@ -226,6 +381,30 @@
             (datetime) the previous day
         next_day
             (datetime) the next day, or None if the current day is today
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+        last_on_page
+            the result number of the last of object in the
+            object_list (1-indexed)
+        first_on_page
+            the result number of the first object in the
+            object_list (1-indexed)
     """
     if extra_context is None: extra_context = {}
     try:
@@ -256,6 +435,16 @@
     else:
         next_day = None
 
+    # Pagination.
+    pagination_context = {'is_paginated': False}
+    if paginate_by:
+        paginator = ObjectPaginator(object_list, paginate_by)
+        page = page or request.GET.get('page', 1)
+        try:
+            object_list, pagination_context = compute_pagination(paginator, page, paginate_by, allow_empty)
+        except InvalidPage:
+            raise Http404
+
     if not template_name:
         template_name = "%s/%s_archive_day.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
@@ -270,6 +459,9 @@
             c[key] = value()
         else:
             c[key] = value
+
+    c.update(pagination_context)
+
     return HttpResponse(t.render(c), mimetype=mimetype)
 
 def archive_today(request, **kwargs):
@@ -288,7 +480,7 @@
         month_format='%b', day_format='%d', object_id=None, slug=None,
         slug_field='slug', template_name=None, template_name_field=None,
         template_loader=loader, extra_context=None, context_processors=None,
-        template_object_name='object', mimetype=None, allow_future=False):
+        template_object_name='object', mimetype=None, allow_future=False, page=None):
     """
     Generic detail view from year/month/day/slug or year/month/day/id structure.
 
@@ -333,6 +525,7 @@
         t = template_loader.get_template(template_name)
     c = RequestContext(request, {
         template_object_name: obj,
+        page: page
     }, context_processors)
     for key, value in extra_context.items():
         if callable(value):
Index: django/views/generic/list_detail.py
===================================================================
--- django/views/generic/list_detail.py	(revision 5992)
+++ django/views/generic/list_detail.py	(working copy)
@@ -1,7 +1,7 @@
 from django.template import loader, RequestContext
 from django.http import Http404, HttpResponse
 from django.core.xheaders import populate_xheaders
-from django.core.paginator import ObjectPaginator, InvalidPage
+from django.core.paginator import compute_pagination, ObjectPaginator, InvalidPage
 from django.core.exceptions import ObjectDoesNotExist
 
 def object_list(request, queryset, paginate_by=None, page=None,
@@ -42,44 +42,30 @@
     """
     if extra_context is None: extra_context = {}
     queryset = queryset._clone()
+
+    if not allow_empty and queryset.count() == 0:
+        raise Http404
+
+    # Pagination.
+    pagination_context = {'is_paginated': False}
     if paginate_by:
         paginator = ObjectPaginator(queryset, paginate_by)
-        if not page:
-            page = request.GET.get('page', 1)
+        page = page or request.GET.get('page', 1)
         try:
-            page = int(page)
-            object_list = paginator.get_page(page - 1)
-        except (InvalidPage, ValueError):
-            if page == 1 and allow_empty:
-                object_list = []
-            else:
-                raise Http404
-        c = RequestContext(request, {
-            '%s_list' % template_object_name: object_list,
-            'is_paginated': paginator.pages > 1,
-            'results_per_page': paginate_by,
-            'has_next': paginator.has_next_page(page - 1),
-            'has_previous': paginator.has_previous_page(page - 1),
-            'page': page,
-            'next': page + 1,
-            'previous': page - 1,
-            'last_on_page': paginator.last_on_page(page - 1),
-            'first_on_page': paginator.first_on_page(page - 1),
-            'pages': paginator.pages,
-            'hits' : paginator.hits,
-        }, context_processors)
-    else:
-        c = RequestContext(request, {
-            '%s_list' % template_object_name: queryset,
-            'is_paginated': False
-        }, context_processors)
-        if not allow_empty and len(queryset) == 0:
+            queryset, pagination_context = compute_pagination(paginator, page, paginate_by, allow_empty)
+        except InvalidPage:
             raise Http404
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: queryset,
+    }, context_processors)
     for key, value in extra_context.items():
         if callable(value):
             c[key] = value()
         else:
             c[key] = value
+
+    c.update(pagination_context)
+
     if not template_name:
         model = queryset.model
         template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
