详细介绍网站分页(Django)

做网站分页,第一步是思考我有哪些数据需要前端传给后台。当然,应该有访问的页码,和内容相关信息。以电商网站为例,内容相关信息就是商品种类信息,比如手机、电脑、显示器等等。只有知道了内容相关信息,我们才知道从数据库里取哪些内容,之后才是分页。

这里,我直接给大家一种解决方案。网页可以是:域名+/参数1+/参数2/+?sort      type对应的是排序方式。这只是一种解决方案,大家可以自由设定,方便就好。

接下来,后台就需要接收一下信息。打开django的应用对应的urls,在里面注册一下。比如url(gooos/(?P<type_id>\d+)/(?P<page>\d+), views.你的函数)   如果你写的是类,就是类.as_view()。

排序方式是get,即sort = request.GET.get('sort')

参数接受到了,我们要对参数进行校验,以防传进来的参数不合法。

对于内容相关的type_id:

try:

type = GoodsType.objects.get(id = type_id)                 GoodsType是存储商品种类的模型类,我们一般把网站里所有商品的种类保存在一个表中。

except GoodsType.DoesNotExist:

 # 发现种类有问题,下面你可以处理一下,比如,返回首页

redirect(reverse('goods:index'))         

# reverse()是反向解析

对于页码page的校验:

# paginator是用于分页的类

if page<=0 or page >= paginator.num_pages:

page = 1

对于sort,我们可以认为,只要不是按人气、价格排序,剩下的都是按照默认方式进行排序:

if sort == 'price':

# sku就是指具体的某个商品,它属于spu。GoodsSKU就是存储网站内所有sku的类。你可以简单理解,SPU是苹果手机,SKU是64G,黑色的苹果手机。

skus = GoodsSKU.objects.filter(type = type).order_by('price')

elif sort == 'hot':

skus = GoodsSKU.objects.filter(type = type).order_by('-sales')

else:

skus = GoodsSKU.objects.filter(type = type).order_by('-id')

# 返回对应页码下的商品

skus_page= paginator.page(page)

# 下面还要对页码进行一下处理。一些网站,比如,当你访问的页面小于3时,它会显示前5页内容,当你访问的页数大于3时,它会返回你访问页数加上它的前两页和后两页。当你访问的页码到了最后3页,就显示最后5页。

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)

把pages传到前端。下面我们来看前端怎么用pages。

{% for pindex in paegs %}

{% 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 %}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值