Django分页案例2

  1. 路由配置

      url(r'^list/(?P\d+)/(?P\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. 模板

    Django分页案例2_第1张图片

你可能感兴趣的:(Django)