做网站分页,第一步是思考我有哪些数据需要前端传给后台。当然,应该有访问的页码,和内容相关信息。以电商网站为例,内容相关信息就是商品种类信息,比如手机、电脑、显示器等等。只有知道了内容相关信息,我们才知道从数据库里取哪些内容,之后才是分页。
这里,我直接给大家一种解决方案。网页可以是:域名+/参数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 %}