Loading django/views/generic/dates.py +10 −6 Original line number Diff line number Diff line Loading @@ -343,7 +343,14 @@ class BaseDateListView(MultipleObjectMixin, DateMixin, View): """ raise NotImplementedError('A DateView must provide an implementation of get_dated_items()') def get_dated_queryset(self, ordering=None, **lookup): def get_ordering(self): """ Returns the field or fields to use for ordering the queryset; uses the date field by default. """ return '-%s' % self.get_date_field() if self.ordering is None else self.ordering def get_dated_queryset(self, **lookup): """ Get a queryset properly filtered according to `allow_future` and any extra lookup kwargs. Loading @@ -354,9 +361,6 @@ class BaseDateListView(MultipleObjectMixin, DateMixin, View): allow_empty = self.get_allow_empty() paginate_by = self.get_paginate_by(qs) if ordering is not None: qs = qs.order_by(ordering) if not allow_future: now = timezone.now() if self.uses_datetime_field else timezone_today() qs = qs.filter(**{'%s__lte' % date_field: now}) Loading Loading @@ -412,7 +416,7 @@ class BaseArchiveIndexView(BaseDateListView): """ Return (date_list, items, extra_context) for this request. """ qs = self.get_dated_queryset(ordering='-%s' % self.get_date_field()) qs = self.get_dated_queryset() date_list = self.get_date_list(qs, ordering='DESC') if not date_list: Loading Loading @@ -451,7 +455,7 @@ class BaseYearArchiveView(YearMixin, BaseDateListView): '%s__lt' % date_field: until, } qs = self.get_dated_queryset(ordering='-%s' % date_field, **lookup_kwargs) qs = self.get_dated_queryset(**lookup_kwargs) date_list = self.get_date_list(qs) if not self.get_make_object_list(): Loading django/views/generic/list.py +14 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ from django.core.paginator import Paginator, InvalidPage from django.core.exceptions import ImproperlyConfigured from django.db.models.query import QuerySet from django.http import Http404 from django.utils import six from django.utils.translation import ugettext as _ from django.views.generic.base import TemplateResponseMixin, ContextMixin, View Loading @@ -20,6 +21,7 @@ class MultipleObjectMixin(ContextMixin): context_object_name = None paginator_class = Paginator page_kwarg = 'page' ordering = None def get_queryset(self): """ Loading @@ -42,8 +44,20 @@ class MultipleObjectMixin(ContextMixin): 'cls': self.__class__.__name__ } ) ordering = self.get_ordering() if ordering: if isinstance(ordering, six.string_types): ordering = (ordering,) queryset = queryset.order_by(*ordering) return queryset def get_ordering(self): """ Return the field or fields to use for ordering the queryset. """ return self.ordering def paginate_queryset(self, queryset, page_size): """ Paginate the queryset, if needed. Loading docs/ref/class-based-views/flattened-index.txt +7 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ ListView * :attr:`~django.views.generic.list.MultipleObjectMixin.context_object_name` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_context_object_name`] * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -301,6 +302,7 @@ ArchiveIndexView * :attr:`~django.views.generic.dates.DateMixin.date_field` [:meth:`~django.views.generic.dates.DateMixin.get_date_field`] * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -338,6 +340,7 @@ YearArchiveView * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.dates.YearArchiveView.make_object_list` [:meth:`~django.views.generic.dates.YearArchiveView.get_make_object_list`] * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -378,6 +381,7 @@ MonthArchiveView * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.dates.MonthMixin.month` [:meth:`~django.views.generic.dates.MonthMixin.get_month`] * :attr:`~django.views.generic.dates.MonthMixin.month_format` [:meth:`~django.views.generic.dates.MonthMixin.get_month_format`] * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -418,6 +422,7 @@ WeekArchiveView * :attr:`~django.views.generic.dates.DateMixin.date_field` [:meth:`~django.views.generic.dates.DateMixin.get_date_field`] * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -462,6 +467,7 @@ DayArchiveView * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.dates.MonthMixin.month` [:meth:`~django.views.generic.dates.MonthMixin.get_month`] * :attr:`~django.views.generic.dates.MonthMixin.month_format` [:meth:`~django.views.generic.dates.MonthMixin.get_month_format`] * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -508,6 +514,7 @@ TodayArchiveView * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.dates.MonthMixin.month` [:meth:`~django.views.generic.dates.MonthMixin.get_month`] * :attr:`~django.views.generic.dates.MonthMixin.month_format` [:meth:`~django.views.generic.dates.MonthMixin.get_month_format`] * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading docs/ref/class-based-views/mixins-multiple-object.txt +16 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,13 @@ MultipleObjectMixin retrieve it with :meth:`get_queryset` which takes care of the cloning behind the scenes. .. attribute:: ordering .. versionadded:: 1.8 A string or list of strings specifying the ordering to apply to the ``queryset``. Valid values are the same as those for :meth:`~django.db.models.query.QuerySet.order_by`. .. attribute:: paginate_by An integer specifying how many objects should be displayed per page. If Loading Loading @@ -110,6 +117,15 @@ MultipleObjectMixin Get the list of items for this view. This must be an iterable and may be a queryset (in which queryset-specific behavior will be enabled). .. method:: get_ordering() .. versionadded:: 1.8 Returns a string (or iterable of strings) that defines the ordering that will be applied to the ``queryset``. Returns :attr:`ordering` by default. .. method:: paginate_queryset(queryset, page_size) Returns a 4-tuple containing (``paginator``, ``page``, ``object_list``, Loading docs/releases/1.8.txt +9 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,15 @@ Forms will also update ``UploadedFile.content_type`` with the image's content type as determined by Pillow. Generic Views ^^^^^^^^^^^^^ * Generic views that use :class:`~django.views.generic.list.MultipleObjectMixin` may now specify the ordering applied to the :attr:`~django.views.generic.list.MultipleObjectMixin.queryset` by setting :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` or overriding :meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering()`. Internationalization ^^^^^^^^^^^^^^^^^^^^ Loading Loading
django/views/generic/dates.py +10 −6 Original line number Diff line number Diff line Loading @@ -343,7 +343,14 @@ class BaseDateListView(MultipleObjectMixin, DateMixin, View): """ raise NotImplementedError('A DateView must provide an implementation of get_dated_items()') def get_dated_queryset(self, ordering=None, **lookup): def get_ordering(self): """ Returns the field or fields to use for ordering the queryset; uses the date field by default. """ return '-%s' % self.get_date_field() if self.ordering is None else self.ordering def get_dated_queryset(self, **lookup): """ Get a queryset properly filtered according to `allow_future` and any extra lookup kwargs. Loading @@ -354,9 +361,6 @@ class BaseDateListView(MultipleObjectMixin, DateMixin, View): allow_empty = self.get_allow_empty() paginate_by = self.get_paginate_by(qs) if ordering is not None: qs = qs.order_by(ordering) if not allow_future: now = timezone.now() if self.uses_datetime_field else timezone_today() qs = qs.filter(**{'%s__lte' % date_field: now}) Loading Loading @@ -412,7 +416,7 @@ class BaseArchiveIndexView(BaseDateListView): """ Return (date_list, items, extra_context) for this request. """ qs = self.get_dated_queryset(ordering='-%s' % self.get_date_field()) qs = self.get_dated_queryset() date_list = self.get_date_list(qs, ordering='DESC') if not date_list: Loading Loading @@ -451,7 +455,7 @@ class BaseYearArchiveView(YearMixin, BaseDateListView): '%s__lt' % date_field: until, } qs = self.get_dated_queryset(ordering='-%s' % date_field, **lookup_kwargs) qs = self.get_dated_queryset(**lookup_kwargs) date_list = self.get_date_list(qs) if not self.get_make_object_list(): Loading
django/views/generic/list.py +14 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ from django.core.paginator import Paginator, InvalidPage from django.core.exceptions import ImproperlyConfigured from django.db.models.query import QuerySet from django.http import Http404 from django.utils import six from django.utils.translation import ugettext as _ from django.views.generic.base import TemplateResponseMixin, ContextMixin, View Loading @@ -20,6 +21,7 @@ class MultipleObjectMixin(ContextMixin): context_object_name = None paginator_class = Paginator page_kwarg = 'page' ordering = None def get_queryset(self): """ Loading @@ -42,8 +44,20 @@ class MultipleObjectMixin(ContextMixin): 'cls': self.__class__.__name__ } ) ordering = self.get_ordering() if ordering: if isinstance(ordering, six.string_types): ordering = (ordering,) queryset = queryset.order_by(*ordering) return queryset def get_ordering(self): """ Return the field or fields to use for ordering the queryset. """ return self.ordering def paginate_queryset(self, queryset, page_size): """ Paginate the queryset, if needed. Loading
docs/ref/class-based-views/flattened-index.txt +7 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ ListView * :attr:`~django.views.generic.list.MultipleObjectMixin.context_object_name` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_context_object_name`] * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -301,6 +302,7 @@ ArchiveIndexView * :attr:`~django.views.generic.dates.DateMixin.date_field` [:meth:`~django.views.generic.dates.DateMixin.get_date_field`] * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -338,6 +340,7 @@ YearArchiveView * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.dates.YearArchiveView.make_object_list` [:meth:`~django.views.generic.dates.YearArchiveView.get_make_object_list`] * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -378,6 +381,7 @@ MonthArchiveView * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.dates.MonthMixin.month` [:meth:`~django.views.generic.dates.MonthMixin.get_month`] * :attr:`~django.views.generic.dates.MonthMixin.month_format` [:meth:`~django.views.generic.dates.MonthMixin.get_month_format`] * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -418,6 +422,7 @@ WeekArchiveView * :attr:`~django.views.generic.dates.DateMixin.date_field` [:meth:`~django.views.generic.dates.DateMixin.get_date_field`] * :attr:`~django.views.generic.base.View.http_method_names` * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -462,6 +467,7 @@ DayArchiveView * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.dates.MonthMixin.month` [:meth:`~django.views.generic.dates.MonthMixin.get_month`] * :attr:`~django.views.generic.dates.MonthMixin.month_format` [:meth:`~django.views.generic.dates.MonthMixin.get_month_format`] * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading Loading @@ -508,6 +514,7 @@ TodayArchiveView * :attr:`~django.views.generic.list.MultipleObjectMixin.model` * :attr:`~django.views.generic.dates.MonthMixin.month` [:meth:`~django.views.generic.dates.MonthMixin.get_month`] * :attr:`~django.views.generic.dates.MonthMixin.month_format` [:meth:`~django.views.generic.dates.MonthMixin.get_month_format`] * :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_by` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_by`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginate_orphans` [:meth:`~django.views.generic.list.MultipleObjectMixin.get_paginate_orphans`] * :attr:`~django.views.generic.list.MultipleObjectMixin.paginator_class` Loading
docs/ref/class-based-views/mixins-multiple-object.txt +16 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,13 @@ MultipleObjectMixin retrieve it with :meth:`get_queryset` which takes care of the cloning behind the scenes. .. attribute:: ordering .. versionadded:: 1.8 A string or list of strings specifying the ordering to apply to the ``queryset``. Valid values are the same as those for :meth:`~django.db.models.query.QuerySet.order_by`. .. attribute:: paginate_by An integer specifying how many objects should be displayed per page. If Loading Loading @@ -110,6 +117,15 @@ MultipleObjectMixin Get the list of items for this view. This must be an iterable and may be a queryset (in which queryset-specific behavior will be enabled). .. method:: get_ordering() .. versionadded:: 1.8 Returns a string (or iterable of strings) that defines the ordering that will be applied to the ``queryset``. Returns :attr:`ordering` by default. .. method:: paginate_queryset(queryset, page_size) Returns a 4-tuple containing (``paginator``, ``page``, ``object_list``, Loading
docs/releases/1.8.txt +9 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,15 @@ Forms will also update ``UploadedFile.content_type`` with the image's content type as determined by Pillow. Generic Views ^^^^^^^^^^^^^ * Generic views that use :class:`~django.views.generic.list.MultipleObjectMixin` may now specify the ordering applied to the :attr:`~django.views.generic.list.MultipleObjectMixin.queryset` by setting :attr:`~django.views.generic.list.MultipleObjectMixin.ordering` or overriding :meth:`~django.views.generic.list.MultipleObjectMixin.get_ordering()`. Internationalization ^^^^^^^^^^^^^^^^^^^^ Loading