Created
April 9, 2025 20:49
-
-
Save pawnhearts/3332e7cf25af6a29cfe67292f81b0e27 to your computer and use it in GitHub Desktop.
django pagination
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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