Index: django/views/generic/date_based.py
===================================================================
--- django/views/generic/date_based.py	(revision 3354)
+++ django/views/generic/date_based.py	(working copy)
@@ -1,11 +1,12 @@
 from django.template import loader, RequestContext
+from django.contrib.auth.views import redirect_to_login
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.xheaders import populate_xheaders
 from django.http import Http404, HttpResponse
 import datetime, time
 
 def archive_index(request, queryset, date_field, num_latest=15,
-        template_name=None, template_loader=loader,
+        template_name=None, template_loader=loader, login_required=False,
         extra_context=None, allow_empty=False, context_processors=None,
         mimetype=None):
     """
@@ -19,6 +20,9 @@
             Latest N (defaults to 15) objects by date
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+	
     model = queryset.model
     queryset = queryset.filter(**{'%s__lte' % date_field: datetime.datetime.now()})
     date_list = queryset.dates(date_field, 'year')[::-1]
@@ -46,8 +50,8 @@
 
 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):
+        login_required=False, context_processors=None, template_object_name='object',
+	mimetype=None, make_object_list=False):
     """
     Generic yearly archive view.
 
@@ -62,6 +66,9 @@
             (Only available if make_object_list argument is True)
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+
     model = queryset.model
     now = datetime.datetime.now()
 
@@ -94,8 +101,8 @@
 
 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):
+        extra_context=None, allow_empty=False, login_required=False,
+	context_processors=None, template_object_name='object', mimetype=None):
     """
     Generic monthly archive view.
 
@@ -111,6 +118,9 @@
             list of objects published in the given month
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+
     try:
         date = datetime.date(*time.strptime(year+month, '%Y'+month_format)[:3])
     except ValueError:
@@ -151,8 +161,8 @@
 
 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):
+        extra_context=None, allow_empty=True, login_required=False,
+	context_processors=None, template_object_name='object', mimetype=None):
     """
     Generic weekly archive view.
 
@@ -164,6 +174,9 @@
             list of objects published in the given week
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+
     try:
         date = datetime.date(*time.strptime(year+'-0-'+week, '%Y-%w-%U')[:3])
     except ValueError:
@@ -200,8 +213,8 @@
 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):
+	login_required=False, context_processors=None,
+	template_object_name='object', mimetype=None):
     """
     Generic daily archive view.
 
@@ -217,6 +230,9 @@
             (datetime) the next day, or None if the current day is today
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+
     try:
         date = datetime.date(*time.strptime(year+month+day, '%Y'+month_format+day_format)[:3])
     except ValueError:
@@ -267,7 +283,7 @@
         month_format='%b', day_format='%d', object_id=None, slug=None,
         slug_field=None, template_name=None, template_name_field=None,
         template_loader=loader, extra_context=None, context_processors=None,
-        template_object_name='object', mimetype=None):
+	login_required=False, template_object_name='object', mimetype=None):
     """
     Generic detail view from year/month/day/slug or year/month/day/id structure.
 
@@ -277,6 +293,9 @@
             the object to be detailed
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+
     try:
         date = datetime.date(*time.strptime(year+month+day, '%Y'+month_format+day_format)[:3])
     except ValueError:
Index: django/views/generic/list_detail.py
===================================================================
--- django/views/generic/list_detail.py	(revision 3354)
+++ django/views/generic/list_detail.py	(working copy)
@@ -1,13 +1,14 @@
 from django.template import loader, RequestContext
 from django.http import Http404, HttpResponse
+from django.contrib.auth.views import redirect_to_login
 from django.core.xheaders import populate_xheaders
 from django.core.paginator import ObjectPaginator, InvalidPage
 from django.core.exceptions import ObjectDoesNotExist
 
 def object_list(request, queryset, paginate_by=None, page=None,
         allow_empty=False, template_name=None, template_loader=loader,
-        extra_context=None, context_processors=None, template_object_name='object',
-        mimetype=None):
+        extra_context=None, login_required=False, context_processors=None,
+	template_object_name='object', mimetype=None):
     """
     Generic list of objects.
 
@@ -35,6 +36,9 @@
             number of objects, total
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+    
     queryset = queryset._clone()
     if paginate_by:
         paginator = ObjectPaginator(queryset, paginate_by)
@@ -80,7 +84,7 @@
 
 def object_detail(request, queryset, object_id=None, slug=None,
         slug_field=None, template_name=None, template_name_field=None,
-        template_loader=loader, extra_context=None,
+        template_loader=loader, extra_context=None, login_required=False,
         context_processors=None, template_object_name='object',
         mimetype=None):
     """
@@ -92,6 +96,9 @@
             the object
     """
     if extra_context is None: extra_context = {}
+    if login_required and request.user.is_anonymous():
+	return redirect_to_login(request)
+
     model = queryset.model
     if object_id:
         queryset = queryset.filter(pk=object_id)
