From ea0030ba9ee90f3a8dba0b6c7399c70b243088d0 Mon Sep 17 00:00:00 2001 From: jose soares Date: Thu, 30 Sep 2010 15:54:05 -0400 Subject: [PATCH 1/2] Removed the PaginatorView and moved its functionality into ListView as an option. This way the default date based list views can be paginated as well. --- class_based_views/__init__.py | 2 +- class_based_views/list.py | 85 +++++++++++++++----------------- class_based_views/tests/views.py | 3 +- 3 files changed, 43 insertions(+), 47 deletions(-) diff --git a/class_based_views/__init__.py b/class_based_views/__init__.py index a2ff3c3..b97a501 100644 --- a/class_based_views/__init__.py +++ b/class_based_views/__init__.py @@ -1,5 +1,5 @@ from class_based_views.base import View, TemplateView -from class_based_views.list import ListView, PaginatedListView +from class_based_views.list import ListView from class_based_views.detail import DetailView from class_based_views.dates import (ArchiveView, YearView, MonthView, WeekView, DayView, TodayView, diff --git a/class_based_views/list.py b/class_based_views/list.py index 6566c83..22335a5 100644 --- a/class_based_views/list.py +++ b/class_based_views/list.py @@ -12,6 +12,7 @@ class ListView(TemplateView): allow_empty = True template_object_name = None queryset = None + paginate_by = None def GET(self, request, *args, **kwargs): queryset = self.get_queryset() @@ -26,12 +27,21 @@ def get_context(self, queryset): """ Get the context for this view. """ - context = { - 'object_list': queryset, - } + context = {'object_list': queryset} template_object_name = self.get_template_object_name(queryset) + if template_object_name is not None: context[template_object_name] = queryset + + if self.get_paginate_by(queryset): + page = self.kwargs.get('page', None) + paginator, page, queryset = self.paginate_queryset(queryset, page) + context.update({ + 'paginator': paginator, + 'page_obj': page, + 'is_paginated': paginator is not None, + }) + return context def get_queryset(self): @@ -48,6 +58,32 @@ def get_queryset(self): queryset = queryset._clone() return queryset + def paginate_queryset(self, queryset, page): + """ + Paginate the queryset, if needed. + """ + paginate_by = self.get_paginate_by(queryset) + paginator = Paginator(queryset, paginate_by, allow_empty_first_page=self.get_allow_empty()) + page = page or self.request.GET.get('page', 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) + except InvalidPage: + raise Http404('Invalid page (%s)' % page_number) + + 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_allow_empty(self): """ Returns ``True`` if the view should display empty lists, and ``False`` @@ -82,45 +118,4 @@ def get_template_object_name(self, queryset): return smart_str(queryset.model._meta.verbose_name_plural) else: return None - - -class PaginatedListView(ListView): - paginate_by = None - - def get_context(self, queryset): - page = self.kwargs.get('page', None) - paginator, page, queryset = self.paginate_queryset(queryset, page) - context = super(PaginatedListView, self).get_context(queryset) - context.update({ - 'paginator': paginator, - 'page_obj': page, - 'is_paginated': paginator is not None, - }) - return context - - def paginate_queryset(self, queryset, page): - """ - Paginate the queryset, if needed. - """ - paginate_by = self.get_paginate_by(queryset) - paginator = Paginator(queryset, paginate_by, allow_empty_first_page=self.get_allow_empty()) - page = page or self.request.GET.get('page', 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) - except InvalidPage: - raise Http404('Invalid page (%s)' % page_number) - - def get_paginate_by(self, queryset): - """ - Get the number of items to paginate by, or ``None`` for no pagination. - """ - return self.paginate_by - + \ No newline at end of file diff --git a/class_based_views/tests/views.py b/class_based_views/tests/views.py index 9c62721..4d4bc49 100644 --- a/class_based_views/tests/views.py +++ b/class_based_views/tests/views.py @@ -31,9 +31,10 @@ class AuthorList(class_based_views.ListView): template_name = 'tests/list.html' -class PaginatedAuthorList(class_based_views.PaginatedListView): +class PaginatedAuthorList(class_based_views.ListView): queryset = Author.objects.all() template_name = 'tests/list.html' + paginate_by = 5 class AuthorCreate(class_based_views.CreateView): From 491c326476507713977a73f76f52a854ddd195ef Mon Sep 17 00:00:00 2001 From: jose soares Date: Thu, 30 Sep 2010 15:58:51 -0400 Subject: [PATCH 2/2] Coerce the _meta.verbose_name_plural to unicode. --- class_based_views/dates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class_based_views/dates.py b/class_based_views/dates.py index 4523f07..d3b8e03 100644 --- a/class_based_views/dates.py +++ b/class_based_views/dates.py @@ -45,7 +45,7 @@ def get_dated_queryset(self, allow_future=False, **lookup): qs = qs.filter(**{'%s__lte' % date_field: datetime.datetime.now()}) if not allow_empty and not qs: - raise Http404("No %s available" % qs.model._meta.verbose_name_plural) + raise Http404("No %s available" % unicode(qs.model._meta.verbose_name_plural)) return qs