class ArchiveIndexView
from django.views.generic import ArchiveIndexView
Top-level archive of date-based items.
Ancestors (MRO)
Attributes
| Defined in | |
|---|---|
| 
                                        allow_empty = False
                                     | BaseDateListView | 
| 
                                        allow_empty = True
                                     | MultipleObjectMixin | 
| 
                                        allow_future = False
                                     | DateMixin | 
| 
                                        content_type = None
                                     | TemplateResponseMixin | 
| 
                                        context_object_name = 'latest'
                                     | BaseArchiveIndexView | 
| 
                                        context_object_name = None
                                     | MultipleObjectMixin | 
| 
                                        date_field = None
                                     | DateMixin | 
| 
                                        date_list_period = 'year'
                                     | BaseDateListView | 
| 
                                        extra_context = None
                                     | ContextMixin | 
| 
                                        http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
                                     | View | 
| 
                                        model = None
                                     | MultipleObjectMixin | 
| 
                                        ordering = None
                                     | MultipleObjectMixin | 
| 
                                        page_kwarg = 'page'
                                     | MultipleObjectMixin | 
| 
                                        paginate_by = None
                                     | MultipleObjectMixin | 
| 
                                        paginate_orphans = 0
                                     | MultipleObjectMixin | 
| 
                                        paginator_class = <class 'django.core.paginator.Paginator'>
                                     | MultipleObjectMixin | 
| 
                                        queryset = None
                                     | MultipleObjectMixin | 
| 
                                        response_class = <class 'django.template.response.TemplateResponse'>
                                     | TemplateResponseMixin | 
| 
                                        template_engine = None
                                     | TemplateResponseMixin | 
| 
                                        template_name = None
                                     | TemplateResponseMixin | 
| 
                                        template_name_suffix = '_archive'
                                     | ArchiveIndexView | 
| 
                                        template_name_suffix = '_list'
                                     | MultipleObjectTemplateResponseMixin | 
| 
                                        uses_datetime_field = <django.utils.functional.cached_property object at 0x7f3dc09f2710>
                                     | DateMixin | 
| 
                                        view_is_async = False
                                     | View | 
Methods
                            
                                
                                    def
                                    __init__(self, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    __init__(self, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
| 52 53 54 55 56 57 58 59 60 | def __init__(self, **kwargs): """ Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things. """ # Go through keyword arguments, and either save their values to our # instance, or raise an error. for key, value in kwargs.items(): setattr(self, key, value) | 
                            
                                
                                    def
                                    _allowed_methods(self):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    _allowed_methods(self):
                                
                                
                                    View
                                
                                ¶
                            | 168 169 | def _allowed_methods(self): return [m.upper() for m in self.http_method_names if hasattr(self, m)] | 
                            
                                
                                    def
                                    _make_date_lookup_arg(self, value):
                                
                                
                                    DateMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    _make_date_lookup_arg(self, value):
                                
                                
                                    DateMixin
                                
                                ¶
                            Convert a date into a datetime when the date field is a DateTimeField. When time zone support is enabled, `date` is assumed to be in the current time zone, so that displayed items are consistent with the URL.
| 269 270 271 272 273 274 275 276 277 278 279 | def _make_date_lookup_arg(self, value): """ Convert a date into a datetime when the date field is a DateTimeField. When time zone support is enabled, `date` is assumed to be in the current time zone, so that displayed items are consistent with the URL. """ if self.uses_datetime_field: value = datetime.datetime.combine(value, datetime.time.min) if settings.USE_TZ: value = timezone.make_aware(value) return value | 
                            
                                
                                    def
                                    _make_single_date_lookup(self, date):
                                
                                
                                    DateMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    _make_single_date_lookup(self, date):
                                
                                
                                    DateMixin
                                
                                ¶
                            Get the lookup kwargs for filtering on a single date. If the date field is a DateTimeField, we can't just filter on date_field=date because that doesn't take the time into account.
| 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | def _make_single_date_lookup(self, date): """ Get the lookup kwargs for filtering on a single date. If the date field is a DateTimeField, we can't just filter on date_field=date because that doesn't take the time into account. """ date_field = self.get_date_field() if self.uses_datetime_field: since = self._make_date_lookup_arg(date) until = self._make_date_lookup_arg(date + datetime.timedelta(days=1)) return { "%s__gte" % date_field: since, "%s__lt" % date_field: until, } else: # Skip self._make_date_lookup_arg, it's a no-op in this branch. return {date_field: date} | 
                            
                                
                                    def
                                    as_view(cls, **initkwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    as_view(cls, **initkwargs):
                                
                                
                                    View
                                
                                ¶
                            Main entry point for a request-response process.
| 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | @classonlymethod def as_view(cls, **initkwargs): """Main entry point for a request-response process.""" for key in initkwargs: if key in cls.http_method_names: raise TypeError( "The method name %s is not accepted as a keyword argument " "to %s()." % (key, cls.__name__) ) if not hasattr(cls, key): raise TypeError( "%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key) ) def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, "request"): raise AttributeError( "%s instance has no 'request' attribute. Did you override " "setup() and forget to call super()?" % cls.__name__ ) return self.dispatch(request, *args, **kwargs) view.view_class = cls view.view_initkwargs = initkwargs # __name__ and __qualname__ are intentionally left unchanged as # view_class should be used to robustly determine the name of the view # instead. view.__doc__ = cls.__doc__ view.__module__ = cls.__module__ view.__annotations__ = cls.dispatch.__annotations__ # Copy possible attributes set by decorators, e.g. @csrf_exempt, from # the dispatch method. view.__dict__.update(cls.dispatch.__dict__) # Mark the callback if the view class is async. if cls.view_is_async: view._is_coroutine = asyncio.coroutines._is_coroutine return view | 
                            
                                
                                    def
                                    dispatch(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    dispatch(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            | 132 133 134 135 136 137 138 139 140 141 142 | def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr( self, request.method.lower(), self.http_method_not_allowed ) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) | 
                            
                                
                                    def
                                    get(self, request, *args, **kwargs):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            
                        
                        
                                    def
                                    get(self, request, *args, **kwargs):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            | 308 309 310 311 312 313 | def get(self, request, *args, **kwargs): self.date_list, self.object_list, extra_context = self.get_dated_items() context = self.get_context_data( object_list=self.object_list, date_list=self.date_list, **extra_context ) return self.render_to_response(context) | 
                            
                                
                                    def
                                    get_allow_empty(self):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_allow_empty(self):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Return ``True`` if the view should display empty lists and ``False`` if a 404 should be raised instead.
| 106 107 108 109 110 111 | def get_allow_empty(self): """ Return ``True`` if the view should display empty lists and ``False`` if a 404 should be raised instead. """ return self.allow_empty | 
                            
                                
                                    def
                                    get_allow_future(self):
                                
                                
                                    DateMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_allow_future(self):
                                
                                
                                    DateMixin
                                
                                ¶
                            Return `True` if the view should be allowed to display objects from the future.
| 249 250 251 252 253 254 | def get_allow_future(self): """ Return `True` if the view should be allowed to display objects from the future. """ return self.allow_future | 
                            
                                
                                    def
                                    get_context_data(self, **kwargs):
                                
                                
                                ¶
                            
                        
                        
                                    def
                                    get_context_data(self, **kwargs):
                                
                                
                                ¶
                            
                                            MultipleObjectMixin
                                        
                                        Get the context for this view.
| 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | def get_context_data(self, *, object_list=None, **kwargs): """Get the context for this view.""" queryset = object_list if object_list is not None else self.object_list page_size = self.get_paginate_by(queryset) context_object_name = self.get_context_object_name(queryset) if page_size: paginator, page, queryset, is_paginated = self.paginate_queryset( queryset, page_size ) context = { "paginator": paginator, "page_obj": page, "is_paginated": is_paginated, "object_list": queryset, } else: context = { "paginator": None, "page_obj": None, "is_paginated": False, "object_list": queryset, } if context_object_name is not None: context[context_object_name] = queryset context.update(kwargs) return super().get_context_data(**context) | 
                                            ContextMixin
                                        
                                        | 28 29 30 31 32 | def get_context_data(self, **kwargs): kwargs.setdefault("view", self) if self.extra_context is not None: kwargs.update(self.extra_context) return kwargs | 
                            
                                
                                    def
                                    get_context_object_name(self, object_list):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_context_object_name(self, object_list):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Get the name of the item to be used in the context.
| 113 114 115 116 117 118 119 120 | def get_context_object_name(self, object_list): """Get the name of the item to be used in the context.""" if self.context_object_name: return self.context_object_name elif hasattr(object_list, "model"): return "%s_list" % object_list.model._meta.model_name else: return None | 
                            
                                
                                    def
                                    get_date_field(self):
                                
                                
                                    DateMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_date_field(self):
                                
                                
                                    DateMixin
                                
                                ¶
                            Get the name of the date field to be used to filter by.
| 241 242 243 244 245 246 247 | def get_date_field(self): """Get the name of the date field to be used to filter by.""" if self.date_field is None: raise ImproperlyConfigured( "%s.date_field is required." % self.__class__.__name__ ) return self.date_field | 
                            
                                
                                    def
                                    get_date_list(self, queryset, date_type=None, ordering='ASC'):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            
                        
                        
                                    def
                                    get_date_list(self, queryset, date_type=None, ordering='ASC'):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            Get a date list by calling `queryset.dates/datetimes()`, checking along the way for empty lists that aren't allowed.
| 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | def get_date_list(self, queryset, date_type=None, ordering="ASC"): """ Get a date list by calling `queryset.dates/datetimes()`, checking along the way for empty lists that aren't allowed. """ date_field = self.get_date_field() allow_empty = self.get_allow_empty() if date_type is None: date_type = self.get_date_list_period() if self.uses_datetime_field: date_list = queryset.datetimes(date_field, date_type, ordering) else: date_list = queryset.dates(date_field, date_type, ordering) if date_list is not None and not date_list and not allow_empty: raise Http404( _("No %(verbose_name_plural)s available") % { "verbose_name_plural": queryset.model._meta.verbose_name_plural, } ) return date_list | 
                            
                                
                                    def
                                    get_date_list_period(self):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            
                        
                        
                                    def
                                    get_date_list_period(self):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            Get the aggregation period for the list of dates: 'year', 'month', or 'day'.
| 357 358 359 360 361 362 | def get_date_list_period(self): """ Get the aggregation period for the list of dates: 'year', 'month', or 'day'. """ return self.date_list_period | 
                            
                                
                                    def
                                    get_dated_items(self):
                                
                                
                                ¶
                            
                        
                        
                                    def
                                    get_dated_items(self):
                                
                                
                                ¶
                            
                                            BaseArchiveIndexView
                                        
                                        Return (date_list, items, extra_context) for this request.
| 396 397 398 399 400 401 402 | def get_dated_items(self): """Return (date_list, items, extra_context) for this request.""" qs = self.get_dated_queryset() date_list = self.get_date_list(qs, ordering="DESC") if not date_list: qs = qs.none() return (date_list, qs, {}) | 
                                            BaseDateListView
                                        
                                        Obtain the list of dates and items.
| 315 316 317 318 319 | def get_dated_items(self): """Obtain the list of dates and items.""" raise NotImplementedError( "A DateView must provide an implementation of get_dated_items()" ) | 
                            
                                
                                    def
                                    get_dated_queryset(self, **lookup):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            
                        
                        
                                    def
                                    get_dated_queryset(self, **lookup):
                                
                                
                                    BaseDateListView
                                
                                ¶
                            Get a queryset properly filtered according to `allow_future` and any extra lookup kwargs.
| 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 | def get_dated_queryset(self, **lookup): """ Get a queryset properly filtered according to `allow_future` and any extra lookup kwargs. """ qs = self.get_queryset().filter(**lookup) date_field = self.get_date_field() allow_future = self.get_allow_future() allow_empty = self.get_allow_empty() paginate_by = self.get_paginate_by(qs) if not allow_future: now = timezone.now() if self.uses_datetime_field else timezone_today() qs = qs.filter(**{"%s__lte" % date_field: now}) if not allow_empty: # When pagination is enabled, it's better to do a cheap query # than to load the unpaginated queryset in memory. is_empty = not qs if paginate_by is None else not qs.exists() if is_empty: raise Http404( _("No %(verbose_name_plural)s available") % { "verbose_name_plural": qs.model._meta.verbose_name_plural, } ) return qs | 
                            
                                
                                    def
                                    get_ordering(self):
                                
                                
                                ¶
                            
                        
                        
                                    def
                                    get_ordering(self):
                                
                                
                                ¶
                            
                                            BaseDateListView
                                        
                                        Return the field or fields to use for ordering the queryset; use the date field by default.
| 321 322 323 324 325 326 | def get_ordering(self): """ Return the field or fields to use for ordering the queryset; use the date field by default. """ return "-%s" % self.get_date_field() if self.ordering is None else self.ordering | 
                                            MultipleObjectMixin
                                        
                                        Return the field or fields to use for ordering the queryset.
| 49 50 51 | def get_ordering(self): """Return the field or fields to use for ordering the queryset.""" return self.ordering | 
                            
                                
                                    def
                                    get_paginate_by(self, queryset):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_paginate_by(self, queryset):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Get the number of items to paginate by, or ``None`` for no pagination.
| 81 82 83 84 85 | def get_paginate_by(self, queryset): """ Get the number of items to paginate by, or ``None`` for no pagination. """ return self.paginate_by | 
                            
                                
                                    def
                                    get_paginate_orphans(self):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_paginate_orphans(self):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Return the maximum number of orphans extend the last page by when paginating.
| 99 100 101 102 103 104 | def get_paginate_orphans(self): """ Return the maximum number of orphans extend the last page by when paginating. """ return self.paginate_orphans | 
                            
                                
                                    def
                                    get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Return an instance of the paginator for this view.
| 87 88 89 90 91 92 93 94 95 96 97 | def get_paginator( self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs ): """Return an instance of the paginator for this view.""" return self.paginator_class( queryset, per_page, orphans=orphans, allow_empty_first_page=allow_empty_first_page, **kwargs, ) | 
                            
                                
                                    def
                                    get_queryset(self):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_queryset(self):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Return the list of items for this view. The return value must be an iterable and may be an instance of `QuerySet` in which case `QuerySet` specific behavior will be enabled.
| 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | def get_queryset(self): """ Return the list of items for this view. The return value must be an iterable and may be an instance of `QuerySet` in which case `QuerySet` specific behavior will be enabled. """ if self.queryset is not None: queryset = self.queryset if isinstance(queryset, QuerySet): queryset = queryset.all() elif self.model is not None: queryset = self.model._default_manager.all() else: raise ImproperlyConfigured( "%(cls)s is missing a QuerySet. Define " "%(cls)s.model, %(cls)s.queryset, or override " "%(cls)s.get_queryset()." % {"cls": self.__class__.__name__} ) ordering = self.get_ordering() if ordering: if isinstance(ordering, str): ordering = (ordering,) queryset = queryset.order_by(*ordering) return queryset | 
                            
                                
                                    def
                                    get_template_names(self):
                                
                                
                                ¶
                            
                        
                        
                                    def
                                    get_template_names(self):
                                
                                
                                ¶
                            
                                            MultipleObjectTemplateResponseMixin
                                        
                                        Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response is overridden.
| 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | def get_template_names(self): """ Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response is overridden. """ try: names = super().get_template_names() except ImproperlyConfigured: # If template_name isn't specified, it's not a problem -- # we just start with an empty list. names = [] # If the list is a queryset, we'll invent a template name based on the # app and model name. This name gets put at the end of the template # name list so that user-supplied names override the automatically- # generated ones. if hasattr(self.object_list, "model"): opts = self.object_list.model._meta names.append( "%s/%s%s.html" % (opts.app_label, opts.model_name, self.template_name_suffix) ) elif not names: raise ImproperlyConfigured( "%(cls)s requires either a 'template_name' attribute " "or a get_queryset() method that returns a QuerySet." % { "cls": self.__class__.__name__, } ) return names | 
                                            TemplateResponseMixin
                                        
                                        Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response() is overridden.
| 196 197 198 199 200 201 202 203 204 205 206 207 | def get_template_names(self): """ Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response() is overridden. """ if self.template_name is None: raise ImproperlyConfigured( "TemplateResponseMixin requires either a definition of " "'template_name' or an implementation of 'get_template_names()'" ) else: return [self.template_name] | 
                            
                                
                                    def
                                    http_method_not_allowed(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    http_method_not_allowed(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            | 144 145 146 147 148 149 150 151 | def http_method_not_allowed(self, request, *args, **kwargs): logger.warning( "Method Not Allowed (%s): %s", request.method, request.path, extra={"status_code": 405, "request": request}, ) return HttpResponseNotAllowed(self._allowed_methods()) | 
                            
                                
                                    def
                                    options(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    options(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            Handle responding to requests for the OPTIONS HTTP verb.
| 153 154 155 156 157 158 159 160 161 162 163 | def options(self, request, *args, **kwargs): """Handle responding to requests for the OPTIONS HTTP verb.""" response = HttpResponse() response.headers["Allow"] = ", ".join(self._allowed_methods()) response.headers["Content-Length"] = "0" if self.view_is_async: async def func(): return response return func() else: return response | 
                            
                                
                                    def
                                    paginate_queryset(self, queryset, page_size):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    paginate_queryset(self, queryset, page_size):
                                
                                
                                    MultipleObjectMixin
                                
                                ¶
                            Paginate the queryset, if needed.
| 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | def paginate_queryset(self, queryset, page_size): """Paginate the queryset, if needed.""" paginator = self.get_paginator( queryset, page_size, orphans=self.get_paginate_orphans(), allow_empty_first_page=self.get_allow_empty(), ) page_kwarg = self.page_kwarg page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 try: page_number = int(page) except ValueError: if page == "last": page_number = paginator.num_pages else: raise Http404( _("Page is not “last”, nor can it be converted to an int.") ) try: page = paginator.page(page_number) return (paginator, page, page.object_list, page.has_other_pages()) except InvalidPage as e: raise Http404( _("Invalid page (%(page_number)s): %(message)s") % {"page_number": page_number, "message": str(e)} ) | 
                            
                                
                                    def
                                    render_to_response(self, context, **response_kwargs):
                                
                                
                                    TemplateResponseMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    render_to_response(self, context, **response_kwargs):
                                
                                
                                    TemplateResponseMixin
                                
                                ¶
                            Return a response, using the `response_class` for this view, with a template rendered with the given context. Pass response_kwargs to the constructor of the response class.
| 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | def render_to_response(self, context, **response_kwargs): """ Return a response, using the `response_class` for this view, with a template rendered with the given context. Pass response_kwargs to the constructor of the response class. """ response_kwargs.setdefault("content_type", self.content_type) return self.response_class( request=self.request, template=self.get_template_names(), context=context, using=self.template_engine, **response_kwargs, ) | 
                            
                                
                                    def
                                    setup(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    setup(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            Initialize attributes shared by all view methods.
| 124 125 126 127 128 129 130 | def setup(self, request, *args, **kwargs): """Initialize attributes shared by all view methods.""" if hasattr(self, "get") and not hasattr(self, "head"): self.head = self.get self.request = request self.args = args self.kwargs = kwargs |