当前位置: 首页 > 工具软件 > Paginator > 使用案例 >

Django学习笔记(四十四):使用Paginator分页器进行分页

贺俊杰
2023-12-01

使用Paginator分页器进行分页

用实例进行分析

views.py部分

# 种类id 页面 排序方式
# restful api -> 请求一种资源
# /list?type_id=种类id&page=页码%sort=排序方式
# list/种类id/页码?/sort=排序方式
class ListView(View):
    '''列表页'''
    def get(self, request, type_id, page):
        '''显示列表页'''
        # 获取种类信息
        try:
            type = GoodsType.objects.get(id=type_id)
        except GoodsType.DoesNotExist:
            # 种类不存在
            return redirect(reverse('goods:index'))

        # 获取商品的分类信息
        types = GoodsType.objects.all()

        # 获取新品信息
        new_skus = GoodsSKU.objects.filter(type=type).order_by('-create_time')[:2]

        # 获取排序的方式 # 获取分类商品的信息
        # sort=default 按照默认id排序
        # sort=price 按照商品价格排序
        # sort=hot 按照商品销量排序
        sort = request.GET.get('sort')
        print(sort)
        if sort == 'price':
            skus = GoodsSKU.objects.filter(type=type_id).order_by('price')
        elif sort == 'hot':
            skus = GoodsSKU.objects.filter(type=type_id).order_by('-sales')
        else:
            sort = 'default'
            skus = GoodsSKU.objects.filter(type=type).order_by('-id')

        # 对数据进行分页
        # 第一个参数是进行分页的对象,第二个参数是每页显示的分页数据数量
        paginator = Paginator(skus, 1)

        # 获取第page页的内容
        try:
            page = int(page)
        except Exception as e:
            page = 1
        # 当没有页数(页数小于1时,默认设置为1)
        if page > paginator.num_pages:
            page = 1

        # 获取第page页的Page实例对象(# 获取这一页的skus实例对象)
        skus_page = paginator.page(page)

        # todo: 进行页码的控制,页面上最多显示5个页码
        # 1.总页数小于5页,页面上显示所有页码
        # 2.如果当前页是前3页,显示1-5页
        # 3.如果当前页是后3页,显示后5页
        # 4.其他情况,显示当前页的前2页,当前页,当前页的后2页
        num_pages = paginator.num_pages
        if num_pages < 5:
            pages = range(1, num_pages+1)
        elif page <= 3:
            pages = range(1, 6)
        elif num_pages - page <= 2:
            pages = range(num_pages-4, num_pages+1)
        else:
            pages = range(page-2, page+2)

        # 获取用户购物车中商品的数目
        user = request.user
        cart_count = 0
        if user.is_authenticated():
            # 用户已登录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d' % user.id
            cart_count = conn.hlen(cart_key)

            # 组织模板上下文
        context = {'type': type, 'types': types,
                   'skus_page': skus_page,
                   'new_skus': new_skus,
                   'cart_count': cart_count,
                   'sort': sort, 'pages': pages}

        return render(request, 'list.html', context)

html部分

			<div class="pagenation">
{#                判断是否有前一页,使用has_previous函数#}
                {% if skus_page.has_previous %}
{#                    通过previous_page_number获得前一个的页页码#}
				<a href="{% url 'goods:list' type.id skus_page.previous_page_number %}?sort={{ sort }}"><上一页</a>
                {% endif %}
{#                    通过paginator.page_range获得所有页码#}
{#                {% for pindex in skus_page.paginator.page_range %}#}
{#                    通过views里的逻辑生成的5个页码pages#}
                    {% for pindex in pages %}
{#                    当遍历的页码等于当前页class生效#}
                    {% if pindex == skus_page.number %}
                        <a href="{% url 'goods:list' type.id pindex %}?sort={{ sort }}" class="active">{{ pindex }}</a>
                    {% else %}
				        <a href="{% url 'goods:list' type.id pindex %}?sort={{ sort }}">{{ pindex }}</a>
                    {% endif %}
                {% endfor %}
{#                通过has_next函数判断是否有下一页#}
                {% if skus_page.has_next %}
{#                通过next_page_number函数获得下一页的页码#}
				<a href="{% url 'goods:list' type.id skus_page.next_page_number %}?sort={{ sort }}">下一页></a>
                {% endif %}
			</div>

 

 类似资料: