Esempio n. 1
0
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