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 编码后的查询字符串