使用Paginator分页器进行分页
用实例进行分析
views.py部分
# 种类id 页面 排序方式
# restful api -> 请求一种资源
# /list?type_id=种类id&page=页码%sort=排序方式
# 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()
# 获取新品信息
new_skus = GoodsSKU.objects.filter(type=type).order_by('-create_time')[:2]
# 获取排序的方式 # 获取分类商品的信息
# sort=default 按照默认id排序
# sort=price 按照商品价格排序
# sort=hot 按照商品销量排序
sort = request.GET.get('sort')
print(sort)
if sort == 'price':
skus = GoodsSKU.objects.filter(type=type_id).order_by('price')
elif sort == 'hot':
skus = GoodsSKU.objects.filter(type=type_id).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
# 当没有页数(页数小于1时,默认设置为1)
if page > paginator.num_pages:
page = 1
# 获取第page页的Page实例对象(# 获取这一页的skus实例对象)
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+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,
'sort': sort, 'pages': pages}
return render(request, 'list.html', context)
html部分
<div class="pagenation">
{# 判断是否有前一页,使用has_previous函数#}
{% if skus_page.has_previous %}
{# 通过previous_page_number获得前一个的页页码#}
<a href="{% url 'goods:list' type.id skus_page.previous_page_number %}?sort={{ sort }}"><上一页</a>
{% endif %}
{# 通过paginator.page_range获得所有页码#}
{# {% for pindex in skus_page.paginator.page_range %}#}
{# 通过views里的逻辑生成的5个页码pages#}
{% for pindex in pages %}
{# 当遍历的页码等于当前页class生效#}
{% 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 %}
{# 通过has_next函数判断是否有下一页#}
{% if skus_page.has_next %}
{# 通过next_page_number函数获得下一页的页码#}
<a href="{% url 'goods:list' type.id skus_page.next_page_number %}?sort={{ sort }}">下一页></a>
{% endif %}
</div>