django Paginator分页+Boostrap样式快速生成分页按钮

django自带分页功能,方便我们快速调用,更多介绍见官方文档
1.导入

from django.core.paginator import Paginator

2.属性和方法

p = Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
#构造Paginator对象
#object_list:要分页的对象,可以是列表,元组,或django中的QuerySet等
#per_page:每页最多的文章数
#orphans:当最后一页的文章数小于或等于该值时,这些文章将被自动合并到前一页
#allow_empty_first_page:是否允许第一页为空

#属性
p.count #文章总数
p.num_pages  #总分页数
p.page_range #页码范围,返回一个列表,从1开始,如[1,2,3,4]

#方法
page = p.page(number) #返回指定页码的page对象,若不存在则抛出错误

#page对象的属性和方法
Page.object_list  #包含当前页的所有对象列表
Page.number       #当前页的页码,从1开始
Page.has_next()   #是否有下一页,若有返回True
Page.has_previous()  #是否有上一页,若有返回True
Page.has_other_pages()  #是否有下一页或上一页,若有返回True
Page.next_page_number() #返回下一页的页码
Page.previous_page_number() #返回上一页的页码
Page.start_index()  #返回当前页的第一个对象在所有对象列表中的序号
Page.end_index()  #返回当前页的最后一个对象在所有对象列表中的序号

3.例子
views.py

def news(request,type): 
	articles = Article.objects.all().filter(category__name = type).order_by('-time')  #导入的Article模型
	p = Paginator(articles,10)   #分页,10篇文章一页
	if p.num_pages <= 1:  #如果文章不足一页
		article_list = articles  #直接返回所有文章
		data = ''  #不需要分页按钮
	else:
		page = int(request.GET.get('page',1))  #获取请求的文章页码,默认为第一页
		article_list = p.page(page) #返回指定页码的页面
		left = []  # 当前页左边连续的页码号,初始值为空
		right = []  # 当前页右边连续的页码号,初始值为空
		left_has_more = False  # 标示第 1 页页码后是否需要显示省略号
		right_has_more = False  # 标示最后一页页码前是否需要显示省略号
		first = False   # 标示是否需要显示第 1 页的页码号。
        # 因为如果当前页左边的连续页码号中已经含有第 1 页的页码号,此时就无需再显示第 1 页的页码号,
        # 其它情况下第一页的页码是始终需要显示的。
        # 初始值为 False
		last = False  # 标示是否需要显示最后一页的页码号。
		total_pages = p.num_pages  
		page_range = p.page_range  
		if page == 1:  #如果请求第1页
			right = page_range[page:page+2]  #获取右边连续号码页
			if right[-1] < total_pages - 1:    # 如果最右边的页码号比最后一页的页码号减去 1 还要小,
            # 说明最右边的页码号和最后一页的页码号之间还有其它页码,因此需要显示省略号,通过 right_has_more 来指示。
				right_has_more = True
			if right[-1] < total_pages:   # 如果最右边的页码号比最后一页的页码号小,说明当前页右边的连续页码号中不包含最后一页的页码
            # 所以需要显示最后一页的页码号,通过 last 来指示
				last = True
		elif page == total_pages:  #如果请求最后一页
			left = page_range[(page-3) if (page-3) > 0 else 0:page-1]  #获取左边连续号码页
			if left[0] > 2:
				left_has_more = True  #如果最左边的号码比2还要大,说明其与第一页之间还有其他页码,因此需要显示省略号,通过 left_has_more 来指示
			if left[0] > 1: #如果最左边的页码比1要大,则要显示第一页,否则第一页已经被包含在其中
				first = True
		else:  #如果请求的页码既不是第一页也不是最后一页
			left = page_range[(page-3) if (page-3) > 0 else 0:page-1]   #获取左边连续号码页
			right = page_range[page:page+2] #获取右边连续号码页
			if left[0] > 2:
				left_has_more = True
			if left[0] > 1:
				first = True
			if right[-1] < total_pages - 1:
				right_has_more = True
			if right[-1] < total_pages:
				last = True
		data = {    #将数据包含在data字典中
			'left':left,
			'right':right,
			'left_has_more':left_has_more,
			'right_has_more':right_has_more,
			'first':first,
			'last':last,
			'total_pages':total_pages,
			'page':page
		}
	return render(request,'news.html',context={
		'article_list':article_list,'data':data
	})

html

{% if data %}
			<ul id="pages" class="pagination pagination-sm pagination-xs">
				{% if data.first %}
					<li><a href="?page=1">1</a></li>
				{% endif %}
				{% if data.left %}
					{% if data.left_has_more %}
						<li><span>...</span></li>
					{% endif %}
					{% for i in data.left %}
						<li><a href="?page={{i}}">{{i}}</a></li>
					{% endfor %}
				{% endif %}
				<li class="active"><a href="?page={{data.page}}">{{data.page}}</a></li>
				{% if data.right %}
					{% for i in data.right %}
						<li><a href="?page={{i}}">{{i}}</a></li>
					{% endfor %}
					{% if data.right_has_more %}
						<li><span>...</span></li>
					{% endif %}
				{% endif %}
				{% if data.last %}
					<li><a href="?page={{data.total_pages}}">{{data.total_pages}}</a></li>
				{% endif %}
			</ul>
{% endif %}

这里写图片描述


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值