Skip to main content

Django Easy Pagination

A Django REST Framework library providing customizable pagination classes with rich metadata and flexible configuration options.

Python Version Django Version DRF Version License

Features

Rich Metadata: Get comprehensive pagination information including total pages, current page, and page size
Multiple Pagination Classes: Pre-configured classes for different use cases
Highly Customizable: Easy to customize page sizes and behavior
Client Control: Allow clients to specify page size via query parameters
Production Ready: Includes comprehensive test suite
Well Documented: Clear documentation and examples

Installation

Install using pip:

pip install django-easy-pagination

Or install from source:

git clone https://github.com/casperspec-1/easy-pagination.git
cd easy-pagination
pip install -e .

Quick Start

1. Add to your Django REST Framework view:

from rest_framework import viewsets
from easy_pagination import StandardPagination

class MyViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    pagination_class = StandardPagination

2. Get paginated responses with rich metadata:

{
    "count": 100,
    "next": "http://api.example.com/items/?page=3",
    "previous": "http://api.example.com/items/?page=1",
    "total_pages": 10,
    "current_page": 2,
    "page_size": 10,
    "results": [...]
}

Available Pagination Classes

StandardPagination

Default pagination for most list views.

  • Default page size: 20 items
  • Max page size: 100 items
  • Best for: General purpose API endpoints
from easy_pagination import StandardPagination

class MyViewSet(viewsets.ModelViewSet):
    pagination_class = StandardPagination

SmallResultsPagination

Optimized for small, quick-loading lists.

  • Default page size: 10 items
  • Max page size: 50 items
  • Best for: Dropdown lists, autocomplete, quick searches
from easy_pagination import SmallResultsPagination

class QuickListViewSet(viewsets.ModelViewSet):
    pagination_class = SmallResultsPagination

LargeResultsPagination

Designed for large datasets and reports.

  • Default page size: 50 items
  • Max page size: 500 items
  • Best for: Reports, data exports, admin interfaces
from easy_pagination import LargeResultsPagination

class ReportViewSet(viewsets.ModelViewSet):
    pagination_class = LargeResultsPagination

NoPagination

Disable pagination for specific views.

  • Returns: All results without pagination
  • Best for: Small datasets, configuration endpoints
  • Warning: Use carefully with large datasets!
from easy_pagination import NoPagination

class ConfigViewSet(viewsets.ModelViewSet):
    pagination_class = NoPagination

Advanced Usage

Custom Pagination Class

Create your own pagination class by extending CustomPageNumberPagination:

from easy_pagination import CustomPageNumberPagination

class MyCustomPagination(CustomPageNumberPagination):
    page_size = 25
    max_page_size = 200
    page_size_query_param = 'page_size'

Dynamic Pagination

Use the factory function to create pagination classes on the fly:

from easy_pagination import get_pagination_class

class MyViewSet(viewsets.ModelViewSet):
    pagination_class = get_pagination_class(page_size=30, max_page_size=200)

Client-Controlled Page Size

Clients can control page size using query parameters:

# Get 50 items per page
GET /api/items/?page_size=50

# Navigate to page 3
GET /api/items/?page=3

# Combine both
GET /api/items/?page=3&page_size=50

Global Configuration

Set a default pagination class for all views in your Django settings:

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'easy_pagination.StandardPagination',
    'PAGE_SIZE': 20
}

Response Schema

All pagination classes return responses with the following structure:

Field Type Description
count integer Total number of items across all pages
next string/null URL to the next page (null if on last page)
previous string/null URL to the previous page (null if on first page)
total_pages integer Total number of pages
current_page integer Current page number (1-indexed)
page_size integer Number of items per page
results array Array of serialized objects for current page

Requirements

  • Python >= 3.7
  • Django >= 3.2
  • djangorestframework >= 3.12

Development

Setup Development Environment

# Clone the repository
git clone https://github.com/casperspec-1/easy-pagination.git
cd easy-pagination

# Install in development mode
pip install -e ".[dev]"

Running Tests

# Run all tests
pytest

# Run with coverage
pytest --cov=easy_pagination

# Run specific test file
pytest tests/test_pagination.py

Code Quality

# Format code with black
black easy_pagination/

# Sort imports
isort easy_pagination/

# Lint with flake8
flake8 easy_pagination/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Casper

Changelog

See CHANGELOG.md for a list of changes.

Support

If you encounter any issues or have questions, please open an issue on GitHub.

Acknowledgments

Built with ❤️ using Django REST Framework.

Metadata

Release files for easy-pagination 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for easy-pagination 0.1.0
File Size Uploaded
easy_pagination-0.1.0.tar.gz 10.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for easy-pagination 0.1.0
File Interpreter ABI Platform
easy_pagination-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 19.9 kB

Release files / easy_pagination-0.1.0.tar.gz

Download URL easy_pagination-0.1.0.tar.gz
Size 10.7 kB
Tags Source
SHA-256 checksum
How to use checksums
fab772777e1811ccc3a13ae2fad236e3dfafd747b801b186469fcff3c1506591
BLAKE2b-256 checksum
How to use checksums
9a6eb9ec44b9e76b469fc71aca3c0f928b06d5910fef14d3fa3cc5e7bce6f6e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 22, 2025.

Transparency log

Release files / easy_pagination-0.1.0-py3-none-any.whl

Download URL easy_pagination-0.1.0-py3-none-any.whl
Size 9.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f5ac4633aaf3e423e08832864a392948338f6650d3105f1eb876a236029e5e7a
BLAKE2b-256 checksum
How to use checksums
9dded0b4f9b2274071d4a17d04d3e3aa949540a272eb2f1da9d8872b70dd4ded
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 22, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page