def get_pagination(item_list, request): page_size, page = request.GET.get('page_size'), request.GET.get('page') if page_size in ("10", "20", "40"): page_size = int(page_size) else: page_size = 10 paginator = Paginator(item_list, page_size) paginator.page_size = page_size try: item_list = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. item_list = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. if page > paginator.num_pages: item_list = paginator.page(paginator.num_pages) else: item_list = paginator.page(1) paginator.first_page = item_list.number - 2 paginator.last_page = item_list.number + 2 if paginator.first_page <= 0: paginator.last_page += 1 - paginator.first_page paginator.first_page = 1 if paginator.last_page > paginator.num_pages: paginator.first_page = paginator.first_page + (paginator.num_pages - paginator.last_page) if paginator.first_page + (paginator.num_pages - paginator.last_page) > 0 else 1 paginator.last_page = paginator.num_pages querydict = request.GET.copy() if 'page' in querydict: del querydict['page'] if 'page_size' in querydict: del querydict['page_size'] pagination_link = "?".join((request.path, querydict.urlencode())) pagination_link = ("%s&" if pagination_link[-1:] != "?" else "%s") % pagination_link return item_list, paginator, pagination_link