分页器

导包 分页器: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">&laquo;</span>
</a>
{% else %}
<span aria-hidden="true">&laquo;</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">&raquo;</span>
</a>
{% else %}
<span aria-hidden="true">&raquo;</span>
{% endif %}

</li>
</ul>
</div>
原文地址:https://www.cnblogs.com/lag1/p/13817685.html