Skip to content

Instantly share code, notes, and snippets.

@pawnhearts
Created April 9, 2025 20:49
Show Gist options
  • Save pawnhearts/3332e7cf25af6a29cfe67292f81b0e27 to your computer and use it in GitHub Desktop.
Save pawnhearts/3332e7cf25af6a29cfe67292f81b0e27 to your computer and use it in GitHub Desktop.
django pagination
from urllib.parse import urljoin
from django.core.paginator import Paginator, Page
from dataclasses import dataclass
from django.utils.safestring import mark_safe
@dataclass
class PageLink:
number: int
is_current: bool
href: str
def __str__(self):
return mark_safe(
f'<a href="{self.href}">{self.number}</a>'
if not self.is_current
else f"<span>{self.number}</span>"
)
class PartPage(Page):
def __init__(self, *args, request):
super().__init__(*args)
self.request = request
@property
def page_range(self):
return (
PageLink(number, number == self.number, self.get_page_href(number))
for number in range(
max(1, self.number - 7),
min(self.number + 7, self.paginator.num_pages),
)
)
def get_page_href(self, number):
query = self.request.GET.copy()
query["page"] = number
return urljoin(self.request.path, "?" + query.urlencode())
class PartPaginator(Paginator):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop("request")
super().__init__(*args, **kwargs)
def _get_page(self, *args, **kwargs):
"""
Return an instance of a single page.
This hook can be used by subclasses to use an alternative to the
standard :cls:`Page` object.
"""
kwargs["request"] = self.request
return PartPage(*args, **kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment