导包 分页器:from django.core.paginator import Paginator
实例化:具体如何分页paginator = Paginator(object_list,each_page_count) 把分页器赋值给一个具体的变量 object_list具体的对象列表 each_page_count每一页放几篇文章
具体页面:page1 = paginator.page(1) 通过paginator的page输入1得到第一页
在shell下,shell下可以看模型具有的方法。
from django.core.paginator import Paginator
from blog.models import Blog
blogs = Blog.objects.all()
paginator = Paginator(blogs,10)
#<string>:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'blog.models.Blog'> QuerySet.
#最好传入的对象的模型有一个排序,否则会警告。
#type(blogs)
#<class 'django.db.models.query.QuerySet'>
class Meta:
ordering = ['-created_time']
设置排序,之后更新迁移文件 同步数据库
分页的使用
前端:发送请求,请求打开具体分页内容
后端:处理请求,返回具体分页内容响应请求
在blog的views中,
from django.core.paginator import Paginator
from .models import Blog,BlogType
def blog_list(request):
blogs_all_list = Blog.objects.all()
paginator = Paginator(blogs_all_list,10) #每10也进行分页
page_num = request.GET.get('page', 1) # 获取url的页面参数(GET请求)
page_of_blogs = paginator.get_page(page_num) #get_page可以把非法字符转换为默认值 某一页
context = {}
#context['blogs'] = page_of_blogs.object_list #具体返回给前端页面的东西,此处多余了,可以通过page_of_blogs获取。通过具体的页面找到它的分页器,而分页器有count属性得到全部(page_of_blogs.paginator.count)。page_of_blogs.object_list得到此页的全部10篇博客
context['page_of_blogs'] = page_of_blogs #因为有分页所以有具体的页码信息
在浏览器中输入,localhost:8000/blog/?page=2进入具体某一页。超出范围、0显示最后1页。无效的返回第一页。
前端页面可以通过传过去的具体页面进行操作,page_of_blogs.paginator.page_range得到页的范围。
依据bootsrap的分页实例写出下面分页按钮的例子:前面判断是否有上一页而显示a链接,中间遍历所有页码page_of_blogs.paginator.page_range
,后面判断是否有下一页。
<div>
<ul class="pagination">
<li>
{% if page_of_blogs.has_previous %}
<a href="?page={{ page_of_blogs.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
{% else %}
<span aria-hidden="true">«</span>
{% endif %}
</li>
{% for page_num in page_of_blogs.paginator.page_range %}
<li><a href="?page={{ page_num }}">{{ page_num }}</a></li>
{% endfor %}
<li>
{% if page_of_blogs.has_next %}
<a href="?page={{ page_of_blogs.next_page_number }}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
{% else %}
<span aria-hidden="true">»</span>
{% endif %}
</li>
</ul>
</div>