42 lines
No EOL
1.4 KiB
Python
42 lines
No EOL
1.4 KiB
Python
from math import ceil
|
|
|
|
class ReusablePaginationMixin:
|
|
"""
|
|
A mixin that encapsulates reusable pagination logic.
|
|
Use in Django ListViews to generate custom pagination context.
|
|
"""
|
|
per_page = 10 # Default; can be overridden in your view.
|
|
|
|
def paginate_data(self, data_list, page_number):
|
|
"""
|
|
Paginate a list of items.
|
|
|
|
Arguments:
|
|
data_list (list): The list of items to paginate.
|
|
page_number (int): Current page number.
|
|
|
|
Returns:
|
|
tuple: (paginated_items, pagination_context)
|
|
"""
|
|
total_items = len(data_list)
|
|
num_pages = ceil(total_items / self.per_page) if self.per_page > 0 else 1
|
|
|
|
# Ensure page_number is within valid bounds.
|
|
if page_number < 1:
|
|
page_number = 1
|
|
elif page_number > num_pages:
|
|
page_number = num_pages
|
|
|
|
start = (page_number - 1) * self.per_page
|
|
end = page_number * self.per_page
|
|
items = data_list[start:end]
|
|
|
|
pagination_context = {
|
|
"number": page_number,
|
|
"has_previous": page_number > 1,
|
|
"has_next": page_number < num_pages,
|
|
"previous_page": page_number - 1 if page_number > 1 else 1,
|
|
"next_page": page_number + 1 if page_number < num_pages else num_pages,
|
|
"paginator": {"num_pages": num_pages},
|
|
}
|
|
return items, pagination_context |