DJANGO-天天生鲜项目从0到1-008-列表页

 本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习

https://www.bilibili.com/video/BV1vt41147K8?p=1

列表页

设计URL

列表页层级为/goods/list/goods_type_id,又因为列表页需要分页和排序,因此url需要包括页码信息和排序方式,即/goods/list/goods_type_id/page/sort_method/

为了符合restful规范,即每个url(除了?的参数部分)指向的应该是某个具体的资源,因此url最终设计到/page/结束,因为排序方式只是针对具体的page数据进行展示的顺序不同,数据的内容是一样的,所以排序方式放在get的参数中,即最后url形式为:/goods/list/goods_type_id/page_num?sort='default'

urlpatterns = [
    ...
    path('goods/list/<int:goods_type_id>/<int:page_num>/', ListView.as_view(), name='list'),
    ...
]

在url.py中包含了两个int类型的参数,?类型的参数是不需要写在url.py中的

排序和分页

编辑view.py文件

# /goods/list/goods_type_id/page_num?sort='default'
class ListView(View):
    '''商品列表视图类'''
    template_name = 'goods/list.html'

    def get(self, request, goods_type_id, page_num):
        '''显示商品列表'''
        # 获取数据信息
        # 全部商品分类
        all_type = GoodsType.objects.all()

        # 当前商品类型
        try:
            goods_type = GoodsType.objects.get(id=goods_type_id)
        except GoodsType.DoesNotExist:
            return redirect(reverse('goods:index'))

        # 新品推荐
        new_goods = Goods.objects.filter(goodstype=goods_type).order_by('-create_time')[:2]

        # 商品列表
        # 排序方式
        sort_dic = {
            'price': 'price',
            'hot': '-sales',
            'default': '-create_time',
        }
        # 获取url地址中的参数
        url_sort = request.GET.get('sort')
        # 将url中的排序参数与排序字典匹配,匹配不到则以默认方式
        if url_sort in sort_dic:
            sort = url_sort
        else:
            sort = 'default'
        # 获取排序字段
        order_by = sort_dic.get(sort)
        goods_list = Goods.objects.filter(goodstype=goods_type).order_by(order_by)

        # 分页
        # 创建分页对象,每页显示1条记录
        paginator = Paginator(goods_list, 1)
        # 获取总页数
        total_page = paginator.num_pages
        # 判断参数的页码是否在分页页码范围内,不在则显示第一页
        if page_num > total_page:
            page_num = 1
        # 当前页的page对象
        page = paginator.page(page_num)

        # 获取显示的页码范围,这里设置只显示三个页码
        if total_page <= 3:
            # 若总页数小于3,则将页码全部显示
            page_list = range(1, total_page+1)
        elif page_num == 1:
            # 若当前页码为1,则范围为1,2,3
            page_list = range(1, 4)
        elif page_num == total_page:
            # 若当前页码为最后一页,则将最后三个页码全部显示
            page_list = range(total_page-2, total_page+1)
        else:
            # 其他情况则显示前一页,当前页,后一页的页码
            page_list = range(page_num-1, page_num+2)

        # 组织上下文
        context = {
            'all_type': all_type,
            'goods_type': goods_type,
            'new_goods': new_goods,
            'sort': sort,
            'page': page,
            'page_list': page_list,
        }
        return render(request, self.template_name, context)

排序

排序使用?sort='method'参数形式,通过request.GET.get(sort)获取参数的值,预定义三种排序方式,若获取到其他值则认为是以默认形式排序

'default'(默认)字段:create_time

'hot'(人气)字段:sales

'price'(价格)字段:price

对应html内容为:

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

分页

使用django提供的分页器

1. 通过Paginator(goods_list, 1)创建分页器对象paginator,第一个参数为可迭代对象,第二个参数为每页显示的记录条数

2. 通过分页器对象paginator.page(page_num)获取当前页的page对象

Paginator对象

Paginator类拥有以下方法和属性:

方法:

Paginator.page(number)[source]

返回指定页面的对象列表,比如第7页的所有内容,下标以1开始。如果提供的页码不存在,抛出InvalidPage异常。

属性:

  • Paginator.count:所有页面的对象总数。
  • Paginator.num_pages:页面总数。
  • Paginator.page_range:基于1的页数范围迭代器。

Page对象

Paginator.page()将返回一个Page对象,我们主要的操作都是基于Page对象的,它具有下面的方法和属性:

方法:

  • Page.has_next()[source]:如果有下一页,则返回True。
  • Page.has_previous()[source]:如果有上一页,返回 True。
  • Page.has_other_pages()[source]:如果有上一页或下一页,返回True。
  • Page.next_page_number()[source]:返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。
  • Page.previous_page_number()[source]:返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。
  • Page.start_index()[source]:返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始计数。 比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3。
  • Page.end_index()[source]:返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index()会返回4。

属性:

  • Page.object_list:当前页上所有对象的列表。
  • Page.number:当前页的序号,从1开始计数。
  • Page.paginator:当前Page对象所属的Paginator对象。

html中使用分页

<div class="pagenation">
    {% if page.has_previous %}
    <a href="{% url 'goods:list' goods_type.id page.previous_page_number %}"><上一页</a>
    {% endif %}
    {% for num in page_list %}
    <a href="{% url 'goods:list' goods_type.id num %}?sort={{ sort }}" {% if num == page.number %}class="active"{% endif %}>{{ num }}</a>
    {% endfor %}
    {% if page.has_next %}
    <a href="{% url 'goods:list' goods_type.id page.next_page_number %}">下一页></a>
    {% endif %}
</div>

https://www.bilibili.com/video/BV1vt41147K8?p=1

列表页

设计URL

列表页层级为/goods/list/goods_type_id,又因为列表页需要分页和排序,因此url需要包括页码信息和排序方式,即/goods/list/goods_type_id/page/sort_method/

为了符合restful规范,即每个url(除了?的参数部分)指向的应该是某个具体的资源,因此url最终设计到/page/结束,因为排序方式只是针对具体的page数据进行展示的顺序不同,数据的内容是一样的,所以排序方式放在get的参数中,即最后url形式为:/goods/list/goods_type_id/page_num?sort='default'

urlpatterns = [
    ...
    path('goods/list/<int:goods_type_id>/<int:page_num>/', ListView.as_view(), name='list'),
    ...
]

在url.py中包含了两个int类型的参数,?类型的参数是不需要写在url.py中的

排序和分页

编辑view.py文件

# /goods/list/goods_type_id/page_num?sort='default'
class ListView(View):
    '''商品列表视图类'''
    template_name = 'goods/list.html'

    def get(self, request, goods_type_id, page_num):
        '''显示商品列表'''
        # 获取数据信息
        # 全部商品分类
        all_type = GoodsType.objects.all()

        # 当前商品类型
        try:
            goods_type = GoodsType.objects.get(id=goods_type_id)
        except GoodsType.DoesNotExist:
            return redirect(reverse('goods:index'))

        # 新品推荐
        new_goods = Goods.objects.filter(goodstype=goods_type).order_by('-create_time')[:2]

        # 商品列表
        # 排序方式
        sort_dic = {
            'price': 'price',
            'hot': '-sales',
            'default': '-create_time',
        }
        # 获取url地址中的参数
        url_sort = request.GET.get('sort')
        # 将url中的排序参数与排序字典匹配,匹配不到则以默认方式
        if url_sort in sort_dic:
            sort = url_sort
        else:
            sort = 'default'
        # 获取排序字段
        order_by = sort_dic.get(sort)
        goods_list = Goods.objects.filter(goodstype=goods_type).order_by(order_by)

        # 分页
        # 创建分页对象,每页显示1条记录
        paginator = Paginator(goods_list, 1)
        # 获取总页数
        total_page = paginator.num_pages
        # 判断参数的页码是否在分页页码范围内,不在则显示第一页
        if page_num > total_page:
            page_num = 1
        # 当前页的page对象
        page = paginator.page(page_num)

        # 获取显示的页码范围,这里设置只显示三个页码
        if total_page <= 3:
            # 若总页数小于3,则将页码全部显示
            page_list = range(1, total_page+1)
        elif page_num == 1:
            # 若当前页码为1,则范围为1,2,3
            page_list = range(1, 4)
        elif page_num == total_page:
            # 若当前页码为最后一页,则将最后三个页码全部显示
            page_list = range(total_page-2, total_page+1)
        else:
            # 其他情况则显示前一页,当前页,后一页的页码
            page_list = range(page_num-1, page_num+2)

        # 组织上下文
        context = {
            'all_type': all_type,
            'goods_type': goods_type,
            'new_goods': new_goods,
            'sort': sort,
            'page': page,
            'page_list': page_list,
        }
        return render(request, self.template_name, context)

排序

排序使用?sort='method'参数形式,通过request.GET.get(sort)获取参数的值,预定义三种排序方式,若获取到其他值则认为是以默认形式排序

'default'(默认)字段:create_time

'hot'(人气)字段:sales

'price'(价格)字段:price

对应html内容为:

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

分页

使用django提供的分页器

1. 通过Paginator(goods_list, 1)创建分页器对象paginator,第一个参数为可迭代对象,第二个参数为每页显示的记录条数

2. 通过分页器对象paginator.page(page_num)获取当前页的page对象

Paginator对象

Paginator类拥有以下方法和属性:

方法:

Paginator.page(number)[source]

返回指定页面的对象列表,比如第7页的所有内容,下标以1开始。如果提供的页码不存在,抛出InvalidPage异常。

属性:

  • Paginator.count:所有页面的对象总数。
  • Paginator.num_pages:页面总数。
  • Paginator.page_range:基于1的页数范围迭代器。

Page对象

Paginator.page()将返回一个Page对象,我们主要的操作都是基于Page对象的,它具有下面的方法和属性:

方法:

  • Page.has_next()[source]:如果有下一页,则返回True。
  • Page.has_previous()[source]:如果有上一页,返回 True。
  • Page.has_other_pages()[source]:如果有上一页或下一页,返回True。
  • Page.next_page_number()[source]:返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。
  • Page.previous_page_number()[source]:返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。
  • Page.start_index()[source]:返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始计数。 比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3。
  • Page.end_index()[source]:返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index()会返回4。

属性:

  • Page.object_list:当前页上所有对象的列表。
  • Page.number:当前页的序号,从1开始计数。
  • Page.paginator:当前Page对象所属的Paginator对象。

html中使用分页

<div class="pagenation">
    {% if page.has_previous %}
    <a href="{% url 'goods:list' goods_type.id page.previous_page_number %}"><上一页</a>
    {% endif %}
    {% for num in page_list %}
    <a href="{% url 'goods:list' goods_type.id num %}?sort={{ sort }}" {% if num == page.number %}class="active"{% endif %}>{{ num }}</a>
    {% endfor %}
    {% if page.has_next %}
    <a href="{% url 'goods:list' goods_type.id page.next_page_number %}">下一页></a>
    {% endif %}
</div>

https://www.bilibili.com/video/BV1vt41147K8?p=1

列表页

设计URL

列表页层级为/goods/list/goods_type_id,又因为列表页需要分页和排序,因此url需要包括页码信息和排序方式,即/goods/list/goods_type_id/page/sort_method/

为了符合restful规范,即每个url(除了?的参数部分)指向的应该是某个具体的资源,因此url最终设计到/page/结束,因为排序方式只是针对具体的page数据进行展示的顺序不同,数据的内容是一样的,所以排序方式放在get的参数中,即最后url形式为:/goods/list/goods_type_id/page_num?sort='default'

urlpatterns = [
    ...
    path('goods/list/<int:goods_type_id>/<int:page_num>/', ListView.as_view(), name='list'),
    ...
]

在url.py中包含了两个int类型的参数,?类型的参数是不需要写在url.py中的

排序和分页

编辑view.py文件

# /goods/list/goods_type_id/page_num?sort='default'
class ListView(View):
    '''商品列表视图类'''
    template_name = 'goods/list.html'

    def get(self, request, goods_type_id, page_num):
        '''显示商品列表'''
        # 获取数据信息
        # 全部商品分类
        all_type = GoodsType.objects.all()

        # 当前商品类型
        try:
            goods_type = GoodsType.objects.get(id=goods_type_id)
        except GoodsType.DoesNotExist:
            return redirect(reverse('goods:index'))

        # 新品推荐
        new_goods = Goods.objects.filter(goodstype=goods_type).order_by('-create_time')[:2]

        # 商品列表
        # 排序方式
        sort_dic = {
            'price': 'price',
            'hot': '-sales',
            'default': '-create_time',
        }
        # 获取url地址中的参数
        url_sort = request.GET.get('sort')
        # 将url中的排序参数与排序字典匹配,匹配不到则以默认方式
        if url_sort in sort_dic:
            sort = url_sort
        else:
            sort = 'default'
        # 获取排序字段
        order_by = sort_dic.get(sort)
        goods_list = Goods.objects.filter(goodstype=goods_type).order_by(order_by)

        # 分页
        # 创建分页对象,每页显示1条记录
        paginator = Paginator(goods_list, 1)
        # 获取总页数
        total_page = paginator.num_pages
        # 判断参数的页码是否在分页页码范围内,不在则显示第一页
        if page_num > total_page:
            page_num = 1
        # 当前页的page对象
        page = paginator.page(page_num)

        # 获取显示的页码范围,这里设置只显示三个页码
        if total_page <= 3:
            # 若总页数小于3,则将页码全部显示
            page_list = range(1, total_page+1)
        elif page_num == 1:
            # 若当前页码为1,则范围为1,2,3
            page_list = range(1, 4)
        elif page_num == total_page:
            # 若当前页码为最后一页,则将最后三个页码全部显示
            page_list = range(total_page-2, total_page+1)
        else:
            # 其他情况则显示前一页,当前页,后一页的页码
            page_list = range(page_num-1, page_num+2)

        # 组织上下文
        context = {
            'all_type': all_type,
            'goods_type': goods_type,
            'new_goods': new_goods,
            'sort': sort,
            'page': page,
            'page_list': page_list,
        }
        return render(request, self.template_name, context)

排序

排序使用?sort='method'参数形式,通过request.GET.get(sort)获取参数的值,预定义三种排序方式,若获取到其他值则认为是以默认形式排序

'default'(默认)字段:create_time

'hot'(人气)字段:sales

'price'(价格)字段:price

对应html内容为:

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

分页

使用django提供的分页器

1. 通过Paginator(goods_list, 1)创建分页器对象paginator,第一个参数为可迭代对象,第二个参数为每页显示的记录条数

2. 通过分页器对象paginator.page(page_num)获取当前页的page对象

Paginator对象

Paginator类拥有以下方法和属性:

方法:

Paginator.page(number)[source]

返回指定页面的对象列表,比如第7页的所有内容,下标以1开始。如果提供的页码不存在,抛出InvalidPage异常。

属性:

  • Paginator.count:所有页面的对象总数。
  • Paginator.num_pages:页面总数。
  • Paginator.page_range:基于1的页数范围迭代器。

Page对象

Paginator.page()将返回一个Page对象,我们主要的操作都是基于Page对象的,它具有下面的方法和属性:

方法:

  • Page.has_next()[source]:如果有下一页,则返回True。
  • Page.has_previous()[source]:如果有上一页,返回 True。
  • Page.has_other_pages()[source]:如果有上一页或下一页,返回True。
  • Page.next_page_number()[source]:返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。
  • Page.previous_page_number()[source]:返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。
  • Page.start_index()[source]:返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始计数。 比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3。
  • Page.end_index()[source]:返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index()会返回4。

属性:

  • Page.object_list:当前页上所有对象的列表。
  • Page.number:当前页的序号,从1开始计数。
  • Page.paginator:当前Page对象所属的Paginator对象。

html中使用分页

<div class="pagenation">
    {% if page.has_previous %}
    <a href="{% url 'goods:list' goods_type.id page.previous_page_number %}"><上一页</a>
    {% endif %}
    {% for num in page_list %}
    <a href="{% url 'goods:list' goods_type.id num %}?sort={{ sort }}" {% if num == page.number %}class="active"{% endif %}>{{ num }}</a>
    {% endfor %}
    {% if page.has_next %}
    <a href="{% url 'goods:list' goods_type.id page.next_page_number %}">下一页></a>
    {% endif %}
</div>

https://www.bilibili.com/video/BV1vt41147K8?p=1

列表页

设计URL

列表页层级为/goods/list/goods_type_id,又因为列表页需要分页和排序,因此url需要包括页码信息和排序方式,即/goods/list/goods_type_id/page/sort_method/

为了符合restful规范,即每个url(除了?的参数部分)指向的应该是某个具体的资源,因此url最终设计到/page/结束,因为排序方式只是针对具体的page数据进行展示的顺序不同,数据的内容是一样的,所以排序方式放在get的参数中,即最后url形式为:/goods/list/goods_type_id/page_num?sort='default'

urlpatterns = [
    ...
    path('goods/list/<int:goods_type_id>/<int:page_num>/', ListView.as_view(), name='list'),
    ...
]

在url.py中包含了两个int类型的参数,?类型的参数是不需要写在url.py中的

排序和分页

编辑view.py文件

# /goods/list/goods_type_id/page_num?sort='default'
class ListView(View):
    '''商品列表视图类'''
    template_name = 'goods/list.html'

    def get(self, request, goods_type_id, page_num):
        '''显示商品列表'''
        # 获取数据信息
        # 全部商品分类
        all_type = GoodsType.objects.all()

        # 当前商品类型
        try:
            goods_type = GoodsType.objects.get(id=goods_type_id)
        except GoodsType.DoesNotExist:
            return redirect(reverse('goods:index'))

        # 新品推荐
        new_goods = Goods.objects.filter(goodstype=goods_type).order_by('-create_time')[:2]

        # 商品列表
        # 排序方式
        sort_dic = {
            'price': 'price',
            'hot': '-sales',
            'default': '-create_time',
        }
        # 获取url地址中的参数
        url_sort = request.GET.get('sort')
        # 将url中的排序参数与排序字典匹配,匹配不到则以默认方式
        if url_sort in sort_dic:
            sort = url_sort
        else:
            sort = 'default'
        # 获取排序字段
        order_by = sort_dic.get(sort)
        goods_list = Goods.objects.filter(goodstype=goods_type).order_by(order_by)

        # 分页
        # 创建分页对象,每页显示1条记录
        paginator = Paginator(goods_list, 1)
        # 获取总页数
        total_page = paginator.num_pages
        # 判断参数的页码是否在分页页码范围内,不在则显示第一页
        if page_num > total_page:
            page_num = 1
        # 当前页的page对象
        page = paginator.page(page_num)

        # 获取显示的页码范围,这里设置只显示三个页码
        if total_page <= 3:
            # 若总页数小于3,则将页码全部显示
            page_list = range(1, total_page+1)
        elif page_num == 1:
            # 若当前页码为1,则范围为1,2,3
            page_list = range(1, 4)
        elif page_num == total_page:
            # 若当前页码为最后一页,则将最后三个页码全部显示
            page_list = range(total_page-2, total_page+1)
        else:
            # 其他情况则显示前一页,当前页,后一页的页码
            page_list = range(page_num-1, page_num+2)

        # 组织上下文
        context = {
            'all_type': all_type,
            'goods_type': goods_type,
            'new_goods': new_goods,
            'sort': sort,
            'page': page,
            'page_list': page_list,
        }
        return render(request, self.template_name, context)

排序

排序使用?sort='method'参数形式,通过request.GET.get(sort)获取参数的值,预定义三种排序方式,若获取到其他值则认为是以默认形式排序

'default'(默认)字段:create_time

'hot'(人气)字段:sales

'price'(价格)字段:price

对应html内容为:

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

分页

使用django提供的分页器

1. 通过Paginator(goods_list, 1)创建分页器对象paginator,第一个参数为可迭代对象,第二个参数为每页显示的记录条数

2. 通过分页器对象paginator.page(page_num)获取当前页的page对象

Paginator对象

Paginator类拥有以下方法和属性:

方法:

Paginator.page(number)[source]

返回指定页面的对象列表,比如第7页的所有内容,下标以1开始。如果提供的页码不存在,抛出InvalidPage异常。

属性:

  • Paginator.count:所有页面的对象总数。
  • Paginator.num_pages:页面总数。
  • Paginator.page_range:基于1的页数范围迭代器。

Page对象

Paginator.page()将返回一个Page对象,我们主要的操作都是基于Page对象的,它具有下面的方法和属性:

方法:

  • Page.has_next()[source]:如果有下一页,则返回True。
  • Page.has_previous()[source]:如果有上一页,返回 True。
  • Page.has_other_pages()[source]:如果有上一页或下一页,返回True。
  • Page.next_page_number()[source]:返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。
  • Page.previous_page_number()[source]:返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。
  • Page.start_index()[source]:返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始计数。 比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3。
  • Page.end_index()[source]:返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index()会返回4。

属性:

  • Page.object_list:当前页上所有对象的列表。
  • Page.number:当前页的序号,从1开始计数。
  • Page.paginator:当前Page对象所属的Paginator对象。

html中使用分页

<div class="pagenation">
    {% if page.has_previous %}
    <a href="{% url 'goods:list' goods_type.id page.previous_page_number %}"><上一页</a>
    {% endif %}
    {% for num in page_list %}
    <a href="{% url 'goods:list' goods_type.id num %}?sort={{ sort }}" {% if num == page.number %}class="active"{% endif %}>{{ num }}</a>
    {% endfor %}
    {% if page.has_next %}
    <a href="{% url 'goods:list' goods_type.id page.next_page_number %}">下一页></a>
    {% endif %}
</div>

猜你喜欢

转载自www.cnblogs.com/gcxblogs/p/12818729.html
今日推荐