Класс BaseMonthArchiveView (Django 2.1)
from django.views.generic.dates import BaseMonthArchiveView
                List of objects published in a given month.
Предки (MRO)
- BaseMonthArchiveView
 - YearMixin
 - MonthMixin
 - BaseDateListView
 - MultipleObjectMixin
 - ContextMixin
 - DateMixin
 - View
 
Потомки
Атрибуты
| Определено в | |
|---|---|
                                    
                                        allow_empty = True
                                    
                                 | 
                                MultipleObjectMixin | 
                                    
                                        allow_empty = False
                                    
                                 | 
                                BaseDateListView | 
                                    
                                        allow_future = False
                                    
                                 | 
                                DateMixin | 
                                    
                                        context_object_name = None
                                    
                                 | 
                                MultipleObjectMixin | 
                                    
                                        date_field = None
                                    
                                 | 
                                DateMixin | 
                                    
                                        date_list_period = 'day'
                                    
                                 | 
                                BaseMonthArchiveView | 
                                    
                                        date_list_period = 'year'
                                    
                                 | 
                                BaseDateListView | 
                                    
                                        extra_context = None
                                    
                                 | 
                                ContextMixin | 
                                    
                                        http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
                                    
                                 | 
                                View | 
                                    
                                        model = None
                                    
                                 | 
                                MultipleObjectMixin | 
                                    
                                        month = None
                                    
                                 | 
                                MonthMixin | 
                                    
                                        month_format = '%b'
                                    
                                 | 
                                MonthMixin | 
                                    
                                        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 | 
                                    
                                        uses_datetime_field = <django.utils.functional.cached_property object at 0x7fdf2c6939e8>
                                    
                                 | 
                                DateMixin | 
                                    
                                        year = None
                                    
                                 | 
                                YearMixin | 
                                    
                                        year_format = '%Y'
                                    
                                 | 
                                YearMixin | 
Методы
def _allowed_methods(self):
    return [m.upper() for m in self.http_method_names if hasattr(self, m)]
                                                Основная точка входа процесса "запрос-ответ".
@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("You tried to pass in the %s method name as a "
                            "keyword argument to %s(). Don't do that."
                            % (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)
        if hasattr(self, 'get') and not hasattr(self, 'head'):
            self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
        return self.dispatch(request, *args, **kwargs)
    view.view_class = cls
    view.view_initkwargs = initkwargs
    # take name and docstring from class
    update_wrapper(view, cls, updated=())
    # and possible attributes set by decorators
    # like csrf_exempt from dispatch
    update_wrapper(view, cls.dispatch, assigned=())
    return view
                                                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):
    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)
                                                Return ``True`` if the view should display empty lists and ``False`` if a 404 should be raised instead.
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
                                                Return `True` if the view should be allowed to display objects from the future.
def get_allow_future(self):
    """
    Return `True` if the view should be allowed to display objects from
    the future.
    """
    return self.allow_future
                                                MultipleObjectMixin
Get the context for this view.
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
def get_context_data(self, **kwargs):
    kwargs.setdefault('view', self)
    if self.extra_context is not None:
        kwargs.update(self.extra_context)
    return kwargs
                                                Get the name of the item to be used in the context.
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_current_month(self, date):
    """Return the start date of the previous interval."""
    return date.replace(day=1)
                                                Возвращает дату начала текущего интервала.
def _get_current_year(self, date):
    """Return the start date of the current interval."""
    return date.replace(month=1, day=1)
                                                BaseMonthArchiveView
Return (date_list, items, extra_context) for this request.
def get_dated_items(self):
    """Return (date_list, items, extra_context) for this request."""
    year = self.get_year()
    month = self.get_month()
    date_field = self.get_date_field()
    date = _date_from_string(year, self.get_year_format(),
                             month, self.get_month_format())
    since = self._make_date_lookup_arg(date)
    until = self._make_date_lookup_arg(self._get_next_month(date))
    lookup_kwargs = {
        '%s__gte' % date_field: since,
        '%s__lt' % date_field: until,
    }
    qs = self.get_dated_queryset(**lookup_kwargs)
    date_list = self.get_date_list(qs)
    return (date_list, qs, {
        'month': date,
        'next_month': self.get_next_month(date),
        'previous_month': self.get_previous_month(date),
    })
                                                BaseDateListView
Obtain the list of dates and items.
def get_dated_items(self):
    """Obtain the list of dates and items."""
    raise NotImplementedError('A DateView must provide an implementation of get_dated_items()')
                                                Get a queryset properly filtered according to `allow_future` and any extra lookup kwargs.
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
                                                Get the name of the date field to be used to filter by.
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
                                                Get a date list by calling `queryset.dates/datetimes()`, checking along the way for empty lists that aren't allowed.
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
                                                Get the aggregation period for the list of dates: 'year', 'month', or 'day'.
def get_date_list_period(self):
    """
    Get the aggregation period for the list of dates: 'year', 'month', or
    'day'.
    """
    return self.date_list_period
                                                Return the month for which this view should display data.
def get_month(self):
    """Return the month for which this view should display data."""
    month = self.month
    if month is None:
        try:
            month = self.kwargs['month']
        except KeyError:
            try:
                month = self.request.GET['month']
            except KeyError:
                raise Http404(_("No month specified"))
    return month
                                                Get a month format string in strptime syntax to be used to parse the month from url variables.
def get_month_format(self):
    """
    Get a month format string in strptime syntax to be used to parse the
    month from url variables.
    """
    return self.month_format
                                                Возвращает дату начала следующего интервала. Интервал определяется датой начала <= дата элемента < следующая дата начала.
def _get_next_month(self, date):
    """
    Return the start date of the next interval.
    The interval is defined by start date <= item date < next start date.
    """
    if date.month == 12:
        try:
            return date.replace(year=date.year + 1, month=1, day=1)
        except ValueError:
            raise Http404(_("Date out of range"))
    else:
        return date.replace(month=date.month + 1, day=1)
                                                Get the next valid month.
def get_next_month(self, date):
    """Get the next valid month."""
    return _get_next_prev(self, date, is_previous=False, period='month')
                                                Возвращает дату начала следующего интервала. Интервал определяется датой начала <= дата элемента < следующая дата начала.
def _get_next_year(self, date):
    """
    Return the start date of the next interval.
    The interval is defined by start date <= item date < next start date.
    """
    try:
        return date.replace(year=date.year + 1, month=1, day=1)
    except ValueError:
        raise Http404(_("Date out of range"))
                                                Get the next valid year.
def get_next_year(self, date):
    """Get the next valid year."""
    return _get_next_prev(self, date, is_previous=False, period='year')
                                                BaseDateListView
Return the field or fields to use for ordering the queryset; use the date field by default.
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.
def get_ordering(self):
    """Return the field or fields to use for ordering the queryset."""
    return self.ordering
                                                Get the number of items to paginate by, or ``None`` for no pagination.
def get_paginate_by(self, queryset):
    """
    Get the number of items to paginate by, or ``None`` for no pagination.
    """
    return self.paginate_by
                                                Return the maximum number of orphans extend the last page by when paginating.
def get_paginate_orphans(self):
    """
    Return the maximum number of orphans extend the last page by when
    paginating.
    """
    return self.paginate_orphans
                                                Return an instance of the paginator for this view.
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)
                                                Get the previous valid month.
def get_previous_month(self, date):
    """Get the previous valid month."""
    return _get_next_prev(self, date, is_previous=True, period='month')
                                                Get the previous valid year.
def get_previous_year(self, date):
    """Get the previous valid year."""
    return _get_next_prev(self, date, is_previous=True, period='year')
                                                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.
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_year(self):
    """Return the year for which this view should display data."""
    year = self.year
    if year is None:
        try:
            year = self.kwargs['year']
        except KeyError:
            try:
                year = self.request.GET['year']
            except KeyError:
                raise Http404(_("No year specified"))
    return year
                                                Получает строку в формате года в синтаксисе strptime, которая будет использоваться для анализа года по переменным URL.
def get_year_format(self):
    """
    Get a year format string in strptime syntax to be used to parse the
    year from url variables.
    """
    return self.year_format
                                                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())
                                                Конструктор. Вызывается в URLconf; может содержать полезные дополнительные ключевые аргументы и другие вещи.
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)
                                                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.
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
                                                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.
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}
                                                Обрабатывает ответы на запросы для запроса HTTP OPTIONS.
def options(self, request, *args, **kwargs):
    """Handle responding to requests for the OPTIONS HTTP verb."""
    response = HttpResponse()
    response['Allow'] = ', '.join(self._allowed_methods())
    response['Content-Length'] = '0'
    return response
                                                Разбивает запрос на страницы, если необходимо.
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)
        })