XH_Digital_Management/common/utils/page_helper.py

61 lines
2.1 KiB
Python
Raw Permalink Normal View History

2024-05-30 17:06:23 +08:00
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
def paginate_query_and_assign_numbers(request, queryset, per_page):
"""
对查询集进行分页并为每页的结果集分配一个连续的序号
参数:
- request: HttpRequest 对象包含从客户端接收的所有HTTP GET请求参数
- queryset: QuerySet 对象包含了要进行分页的数据集
- per_page: int, 每页期望显示的条目数量
返回:
- page: 当前页的 Page 对象
"""
# 获取请求的页码默认第1页
page = request.GET.get('page', '1')
# 确保页码是有效的整数否则默认为第1页
page_number = int(page) if page.isdigit() else 1
# 计算当前页的第一个条目的序号
first_item_number = (page_number - 1) * per_page
# 创建 Paginator 对象实例进行分页操作
paginator = Paginator(queryset, per_page)
try:
# 获取当前页码的Page对象
page_items = paginator.page(page_number)
except PageNotAnInteger:
# 如果页码不是整数,则展示第一页,并计算当前页的第一个序号
page_items = paginator.page(1)
first_item_number = 0
except EmptyPage:
# 如果页码超出范围(即没有这么多页),则展示最后一页,并计算当前页的第一个序号
page_items = paginator.page(paginator.num_pages)
first_item_number = (paginator.num_pages - 1) * per_page
# 给每个列表对象添加序号
for index, item in enumerate(page_items):
item.number = first_item_number + index + 1
return page_items
def get_query_params_without_page(request):
"""
从请求中复制查询参数并移除 'page' 参数
参数:
- request: HttpRequest 对象包含 GET 请求参数
返回:
- url编码后的查询字符串不包含 'page' 参数
"""
query_params = request.GET.copy() # 复制请求的查询参数
query_params.pop('page', None) # 移除 'page' 参数,如果不存在则忽略
return query_params.urlencode() # 返回 url 编码后的查询字符串