Django分页案例2

  1. 路由配置

      url(r'^list/(?P<type_id>\d+)/(?P<page>\d+)$', ListView.as_view(), name='list'), # 列表页
    
  2. 视图函数, 还要导入分页模块

     # 导入django分页类
     from django.core.paginator import Paginator
     # 种类id 对应的页码 排序方式
     # restful api-> 请求一种资源
     # /list?type_id=种类的id&page=页码&sort=排序方式
     # /list/种类id/页码/排序排序方式
     # /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()
     
             # 获取排序的方式
             # sort=default 按照默认id排序
             # sort=price 按照商品价格排序
             # sort=hot 按照商品的销量排序
             sort = request.GET.get('sort')
     
             if sort == 'price':
                 skus = GoodsSKU.objects.filter(type=type).order_by('price')
             elif sort == 'hot':
                 skus = GoodsSKU.objects.filter(type=type).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
     
             # paginator.num_pages 显示总页数
             if page > paginator.num_pages:
                 page = 1
     
             # 返回Page对象 这个对象包含了这一页的所有数据
             # 获取第page页的Page实列对象
             skus_page = paginator.page(page)
     
             # todo: 进行页码的控制, 页面上最多显示54个页码
             # 1. 总页数小于5页, 页面上显示所有页码
             # 2. 如果当前页是前3页, 显示1-5页
             # 3. 如果当前页是后3页, 显示后5页
             # 4.其他情况, 显示当前页的前2页, 当前页, 当前页的后两页
             # paginator.num_pages 显示总页数
             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+3)
     
             # 获取新品信息
             # 就是获取同种类的信息
             # 安创建时间降序排列
             # 取两个
             new_skus = GoodsSKU.objects.filter(type=type).order_by('-create_time')[:2]
     
             # 获取用户购物车商品的数目
             # 拿到用户对象
             user = request.user
             # 购物车商品数目
             cart_count = 0
             # 如果你使用is_authenticated()判断用户是否登录,那么意味着你采用了django的auth系统,
             if user.is_authenticated():
                 # 用户已登入
                 # 获取一个redis对象 参数是default 所以对应的是redis9好数据库
                 conn = get_redis_connection('default')
                 # 构造哈希值
                 cart_key = 'cart_%d' % user.id
                 # 把哈希值的键传入进去 得到商品数目(不包含个数 列苹果10个 草莓10个  这里只会显示2个)
                 cart_count = conn.hlen(cart_key)
     
             # 构造上下文
             context = {
                 'type':type,
                 'types':types,
                 'skus_page':skus_page,
                 'new_skus':new_skus,
                 'cart_count':cart_count,
                 'pages':pages,
                 'sort':sort
             }
     
             # 使用模板
             return render(request, 'list.html', context)
    
  3. 模板

    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值