61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
|
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 编码后的查询字符串
|