python3 之 天天生鲜 列表页 排序order_by() 和 分页器Paginator

python3  之 天天生鲜  列表页 排序order_by() 和 分页器Paginator[Python常见问题]

 

 url(r"^list/(?P<category_id>d*)/(?P<page_num>d*)$", views.ListGoods.as_view(), name="list"),
(?P<category_id>d*)/(?P<page_num>d*)  定义了   def get(self,request,category_id,page_num):   传参必须要用的 变量名
class ListGoods(View):
    def get(self,request,category_id,page_num):
        # 获取sort参数:如果用户不传,就是默认的排序规则
        sort = request.GET.get("sort")
        #商品种类
        categorys = GoodsCategory.objects.all()
        #得到某一种类  get
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist: #DoesNot:不 Exist:存在
            return  redirect("/list/1/1")

        # 查询该类别所有商品SKU信息:按照排序规则来查询
        if sort == "price":
            # 按照价格由低到高
            skus = GoodsSKU.objects.filter(category=category).order_by("price")
        elif sort == "hot":
            # 按照销量由高到低
            skus = GoodsSKU.objects.filter(category=category).order_by("-sales")                              #倒序
        else:
            # 默认 如果不传入.order_by(字段),会发出警告!!  UnorderedObjectListWarning
            skus = GoodsSKU.objects.filter(category=category).order_by("id")
            # 无论用户是否传入或者传入其他的排序规则,我在这里都重置成"default"
            sort = "default"

        #新品推荐
        new_skus = skus.order_by("-create_time")[:2]

        # 创建分页器 对象     一页显示的数量
        paginator = Paginator(skus,2)
        page_num = int(page_num) #转换
        try:
            #获取  第几页的对象
            page_skus = paginator.page(page_num)
        except EmptyPage:
        # except Exception:
            page_skus = paginator.page(1)
        #获得页数列表 一共几页 可遍历出来1,2,3...
        page_list = paginator.page_range

        context = {
            "sort":sort,
            "categorys": categorys,
            "category": category,
            "page_skus":page_skus,
            "new_skus":new_skus,
            "page_list":page_list,
        }
        # 购物车
        cart_num = 0
        # 自定义购物车函数
        cart_num = cartnum(request, cart_num)
        # 字典更新 /添加 购物车数量
        context.update(cart_num=cart_num)

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

html

<div class="sort_bar">

                <a href="{% url "goods:list" category.id 1 %}?sort=default" {% if sort == "default" %}class="active"{% endif %}>默认</a>
                <a href="{% url "goods:list" category.id 1 %}?sort=price" {% if sort == "price" %}class="active"{% endif %}>价格</a>
                <a href="{% url "goods:list" category.id 1 %}?sort=hot" {% if sort == "hot" %}class="active"{% endif %}>人气</a>

            </div>
{% if sort == "default" %}class="active"{% endif %}   active 在css里设定了样式

 

类似于这样:

 

 

 

 分页器

# 创建分页器 对象  一页显示2个商品
        paginator = Paginator(skus,2)
        page_num = int(page_num) #转换
        try:
            #获取  第几页的对象
            page_skus = paginator.page(page_num)
        except EmptyPage:
        # except Exception:
            page_skus = paginator.page(1)
        #获得页数列表 一共几页 可遍历出来1,2,3...
        page_list = paginator.page_range
<div class="pagenation">
                <a href="{% url "goods:list" category.id 1 %}?sort={{ sort }}">首页</a>
                {% if page_skus.has_previous %}
                    <!-- previous page number:之前的页码  -->
                    <a href="{% url "goods:list" category.id page_skus.previous_page_number %}?sort={{ sort }}">&lt;上一页</a>
                {% endif %}

                {% for page in page_list %}
                    <a href="{% url "goods:list" category.id page %}?sort={{ sort }}"
                       {% if page == page_skus.number %} class="active" {% endif %}>{{ page }}</a>
                {% endfor %}

                {% if page_skus.has_next %}
                    <a href="{% url "goods:list" category.id page_skus.next_page_number %}?sort={{ sort }}">下一页></a>
                {% endif %}