Skip to main content

infinite-scroll-pagination is a Django app that implements the *seek method* for scalable pagination..

Project description

infinite-scroll-pagination is a Django app that implements the seek method (AKA Keyset Paging) for scalable pagination.

How it works

Keyset driven paging relies on remembering the top and bottom keys of the last displayed page, and requesting the next or previous set of rows, based on the top/last keyset

This approach has two main advantages over the OFFSET/LIMIT approach:

  • is correct: unlike the offset/limit based approach it correctly handles new entries and deleted entries. Last row of Page 4 does not show up as first row of Page 5 just because row 23 on Page 2 was deleted in the meantime. Nor do rows mysteriously vanish between pages. These anomalies are common with the offset/limit based approach, but the keyset based solution does a much better job at avoiding them.

  • is fast: all operations can be solved with a fast row positioning followed by a range scan in the desired direction

For a full explanation go to the seek method

Requirements

infinite-scroll-pagination requires the following software to be installed:

  • Python 2.7

  • Django +1.4 (tested locally on 1.6)

Configuration

  1. None :smile:

Usage

Paging by date or any other field:

# views.py

from infinite_scroll_pagination.paginator import SeekPaginator


def pagination_ajax(request, pk=None):
    if not request.is_ajax():
        return Http404()

    if pk is not None:
        # I'm doing an extra query because datetime serialization/deserialization is hard
        date = get_object_or_404(Article, pk=pk).date
    else:
        # is requesting the first page
        date = None

    articles = Article.objects.all()
    paginator = SeekPaginator(articles, per_page=20, lookup_field="date")
    page = paginator.page(value=date, pk=pk)

    articles_list = [{"title": a.title, } for a in page]
    data = {'articles': articles_list,
            'has_next': page.has_next(),
            'pk': page[-1].pk}

    return HttpResponse(json.dumps(data), content_type="application/json")

Paging by pk or id (special case):

# views.py

def pagination_ajax(request, pk=None):
    #...

    page = paginator.page(value=pk, pk=pk)

    #...

Showing how many objects (or pages) are left:

Note: For true infinite scroll, this is not recommended. Since it does a count() query.

It would be better if you increase an IntegerField every time a record is saved and do some javascript magic to know how many objects are left.

#...

page_first = paginator.page()

data = {'objects_left_count': page_first.objects_left,
        'pages_left_count': page_first.pages_left,
        #...}

Limitations

  • I decided not to implement the get previous page because there is no way to know if the previous page even exists anymore, rows may have been removed. Although, it’d work for dynamic content that inserts rows (but does not delete them). If you have some thoughts about how this can be solved, you may open an issue.

  • Order is DESC (from newest to latest). You may submit a pull request for ASC order support.

Contributing

Feel free to check out the source code and submit pull requests.

You may also report any bug or propose new features in the issues tracker

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-infinite-scroll-pagination-0.1.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

File details

Details for the file django-infinite-scroll-pagination-0.1.tar.gz.

File metadata

File hashes

Hashes for django-infinite-scroll-pagination-0.1.tar.gz
Algorithm Hash digest
SHA256 6364b4a6b8d373c66900efeb59fdf4409b4a46b401e7b94e5fce5f65014f6f12
MD5 93e11377acfee1c32b9f261aa322bcb4
BLAKE2b-256 89618da3c1b863ecc62121b0d067a3f7159a089631666af55153854813905b43

See more details on using hashes here.

File details

Details for the file django_infinite_scroll_pagination-0.1-py2.7.egg.

File metadata

File hashes

Hashes for django_infinite_scroll_pagination-0.1-py2.7.egg
Algorithm Hash digest
SHA256 1041fe591eabe7daba5b22de1ce0d27df23d07e19281833cf154671bdea96541
MD5 40fffa7a20536166723ffcabe70111c6
BLAKE2b-256 5e8729ebfc1fa668b13fb51660bbc26146f105c09afea062b2ed84ed95ce9e93

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page