diff -r 470ea7806537 -r 216b3f9582aa src/p4l/search/views.py --- a/src/p4l/search/views.py Tue Dec 03 13:54:30 2013 +0100 +++ b/src/p4l/search/views.py Tue Dec 03 20:55:04 2013 +0100 @@ -33,11 +33,14 @@ from django.conf import settings +from django.core.paginator import InvalidPage +from django.http.response import Http404 from django.template.context import RequestContext from haystack.query import SearchQuerySet from haystack.views import SearchView, search_view_factory from p4l.search.forms import RecordSearchForm +from p4l.utils import P4lPaginator class RecordSearchView(SearchView): @@ -52,3 +55,32 @@ @classmethod def as_view(cls): return search_view_factory(view_class=cls) + + def build_page(self): + """ + Paginates the results appropriately. + + In case someone does not want to use Django's built-in pagination, it + should be a simple matter to override this method to do what they would + like. + """ + try: + page_no = int(self.request.GET.get('page', 1)) + except (TypeError, ValueError): + raise Http404("Not a valid number for page.") + + if page_no < 1: + raise Http404("Pages should be 1 or greater.") + + start_offset = (page_no - 1) * self.results_per_page + self.results[start_offset:start_offset + self.results_per_page] + + paginator = P4lPaginator(self.results, self.results_per_page) + + try: + page = paginator.page(page_no) + except InvalidPage: + raise Http404("No such page!") + + return (paginator, page) +