django-列表分页和排序

Posted yifengs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django-列表分页和排序相关的知识,希望对你有一定的参考价值。

视图函数views.py

# 种类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

        if page > paginator.num_pages:
            page = 1

        # 获取第page页的Page实例对象
        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+3)

        # 获取新品信息
        new_skus = GoodsSKU.objects.filter(type=type).order_by(-create_time)[: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,
                   pages:pages,
                   sort:sort

        # 使用模板
        return render(request, list.html, context)

 模板

% extends ‘base_detail_list.html‘ %
% block title %天天生鲜-商品列表% endblock title %
% block main_content %
    <div class="breadcrumb">
        <a href="#">全部分类</a>
        <span>></span>
        <a href="#"> type.name </a>
    </div>

    <div class="main_wrap clearfix">
        <div class="l_wrap fl clearfix">
            <div class="new_goods">
                <h3>新品推荐</h3>
                <ul>
                    % for sku in new_skus %
                    <li>
                        <a href="% url ‘goods:detail‘ sku.id %"><img src=" sku.image.url "></a>
                        <h4><a href="% url ‘goods:detail‘ sku.id %"> sku.name </a></h4>
                        <div class="prize">¥ sku.price </div>
                    </li>
                    % endfor %
                </ul>
            </div>
        </div>

        <div class="r_wrap fr clearfix">
            <div class="sort_bar">
                <a href="% url ‘goods:list‘ type.id 1 %" % if sort == ‘default‘ %class="active"% endif %>默认</a>
                <a href="% url ‘goods:list‘ type.id 1 %?sort=price" % if sort == ‘price‘ %class="active"% endif %>价格</a>
                <a href="% url ‘goods:list‘ type.id 1 %?sort=hot" % if sort == ‘hot‘ %class="active"% endif %>人气</a>
            </div>

            <ul class="goods_type_list clearfix">
                % for sku in skus_page %
                <li>
                    <a href="% url ‘goods:detail‘ sku.id %"><img src=" sku.image.url "></a>
                    <h4><a href="% url ‘goods:detail‘ sku.id %"> sku.name </a></h4>
                    <div class="operate">
                        <span class="prize">¥ sku.price </span>
                        <span class="unit"> sku.price/ sku.unite </span>
                        <a href="#" class="add_goods" title="加入购物车"></a>
                    </div>
                </li>
                % endfor %
            </ul>

            <div class="pagenation">
                % if skus_page.has_previous %
                <a href="% url ‘goods:list‘ type.id skus_page.previous_page_number %?sort= sort "><上一页</a>
                % endif %
                % for pindex in pages %
                    % 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 %
                % if skus_page.has_next %
                <a href="% url ‘goods:list‘ type.id skus_page.next_page_number %?sort= sort ">下一页></a>
                % endif %
            </div>
        </div>
    </div>
% endblock main_content %

 

以上是关于django-列表分页和排序的主要内容,如果未能解决你的问题,请参考以下文章

DjangoQuerySet的分页和排序

列表分页和代码语法高亮

列表分页和代码语法高亮

Django分页和“当前页面”

Django-分页和中间件

Django的分页和中间件