Django----分页器的使用
一、首先我们进入到shell命令下查看相关的信息:
python manage.py shell ----->执行此条命令后进入shell命令
1.在shell命令模式下创建新的博客:
>>> from blog.models import Blog >>> blog = Blog()#首先要进行实例化操作 >>> dir() ['Blog', '__builtins__', 'blog']
2.创建之前需要导入需要的一些模块:在shell命令下创建30篇文章。
>>> for i in range(1,31): ... blog = Blog() ... blog.title = 'for i%s'%i ... blog.content = 'wwwwwww i%s'%i ... blog.author = User.objects.all()[0] ... blog.typename = Blogtype.objects.all()[0] ... blog.save() ... >>> >>> Blog.objects.count()
3.我们可以查询到很多的方法首先导入分页器:
from django.core.paginator import Paginator---->django核心代码导入分页器。
form blog.modles import Blog
blogs = Blog.objects.all()
paginator = Paginator(blogs,10)-------------------->开始分页传入所有的值,以及10篇内容为一页。
===========这里会出现一个问题,因为前面我们创建的内容是一个无序的没有编号的内容===========
因此我们先要调整一下modles里面的代码:
class Blog(models.Model):
title = models.CharField(max_length = 30)
typename = models.ForeignKey(Blogtype,on_delete = models.DO_NOTHING)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
up_dated_time = models.DateTimeField(auto_now=True)
author = models.ForeignKey(User,on_delete=models.DO_NOTHING)
def __str__(self):
return "<Blog%s>"%self.title
class Meta:
ordering = ['-create_time']
1.首先来看看paginator常用的方法:
'count', 'get_page', 'num_pages', 'object_list', 'orphans', 'page', 'page_range', 'per_page', 'validate_number']
paginator.count------->统计所有的博客数量
get_page:用来处理用户的非法输入--------->page_of_blogs = paginator.get_page(page_num)
object_list:用来遍历出当前页的页面内容
page_range:---->用来显示底部页码。
num_pages------->显示总的页数
2.获取某页:
page1 = paginator.page(1)
>>> page1 = paginator.page(1) >>> page1 <Page 1 of 4>
3.以下是page1所可以使用的方法:
'count', 'end_index', 'has_next', 'has_other_pages', 'has_previous', 'index', 'next_page_number', 'number', 'object_list', 'paginator',
'previous_page_number', 'start_index'
page1.number------------------->显示当前页的页码
has_previous--------------->{#判断是否存在上一页#}
has_next--------------->{#判断是否存在下一页#}
previous_page_number------------------------->{#判断当前上一页所在位置#}
next_page_number------------------------->{#判断当前下一页所在位置#}
二、分页器的使用:
{#分页器#} <ul class="pagination"> <li> {%if page_of_blogs.has_previous%}{#判断是否存在上一页#} <a href="?page={{page_of_blogs.previous_page_number}}" aria-label="Previous">{#previous_page_number判断当前页#} <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}}"><span>{{page_num}}</span></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>
def bloglist(request): blogs = Blog.objects.all() paginator = Paginator(blogs,10)#每10篇文章分一页 page_num = request.GET.get('page',1)#GET方法获得url参数?page1 page是参数需要带引号 page_of_blogs = paginator.get_page(page_num)#get_page方法处理用户输入的错误值 contenx = {} contenx['page_of_blogs'] = page_of_blogs # contenx['blogs'] = page_of_blogs.object_list#获取符合参数所有的文章 # contenx['count'] = Blog.objects.all().count() contenx['blogtypes'] = Blogtype.objects.all()#获取所有的分类 return render_to_response('blog/list.html',contenx)
三、分页器的优化:如果有大量的内容时,前面的方法分页器就会很长,所以需要优化!
1.current_page_num (是获取当前页的页码)使用number方法:
rang_page = 获取的是一个页码的范围:[current_page_num-2,current_page_num-1,current_page_num-2,current_page_num+1,current_page_num+2]即可获得当前页,前两页和后两列的页数。这样我们发现多了一些数字,0,-1页等是我们不需要的,因此我们让当前的数例如1-2会得到-1,我们将它和1作对比取最大的那个,到单前页的范围。这样在最小值这里我们就截掉了我们不需要的数字,最大的方向也是一样的,只不过我们要取小的那个值。
blogs = Blog.objects.all() paginator = Paginator(blogs,2)#每10篇文章分一页 page_num = request.GET.get('page',1)#GET方法获得url参数?page1 page是参数需要带引号 page_of_blogs = paginator.get_page(page_num)#get_page方法处理用户输入的错误值 current_page_num = page_of_blogs.number#获得当前页 # 比较截取到想要的那个数到最小值1时用小的值和1作比较生成一个从小到当前的值 range_page = list(range(max(current_page_num-2,1),current_page_num))+\ list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1)) # range(当前到---->想要的那个值取到最后最小的那个值
2.为了继续优化,添加首页和尾页:这样我们就可以插入1和最大的那个页数
if range_page[0]!=1: range_page.insert(0,1) if range_page[-1]!=paginator.num_pages: range_page.append(paginator.num_pages)
3.添加省略号。
#添加省略号 if range_page[0]-1>=2: range_page.insert(0,'...') if paginator.num_pages-range_page[-1]>=2: range_page.append('...')
4.优化模板文件:
{#分页器#} <div class="paginator"> <ul class="pagination"> <li> {%if page_of_blogs.has_previous%} {#判断是否存在上一页#} <a href="?page={{page_of_blogs.previous_page_number}}" aria-label="Previous">{#previous_page_number判断当前页#} <span aria-hidden="true">«</span> </a> {%else%} <span aria-hidden="true">«</span> {%endif%} </li> {#总的页数#} {%for page_num in range_page%} {% if page_num == page_of_blogs.number %} <li class="active"> <span>{{page_num}}</span> </li>{#当前页高亮#} {% else %} {% if page_num == '...' %} <li><span>{{page_num}}</span></li> {% else %} <li> <a href="?page={{page_num}}"> {{page_num}} </a> </li> {% endif %} {% endif %} {%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> <p>(共{{page_of_blogs.paginator.num_pages}}页,当前{{page_of_blogs.number}}页,共有{{page_of_blogs.paginator.count}}篇博客)</p> </div> </div>
5.视图函数修改:
def bloglist(request): blogs = Blog.objects.all() paginator = Paginator(blogs,2)#每10篇文章分一页 page_num = request.GET.get('page',1)#GET方法获得url参数?page1 page是参数需要带引号 page_of_blogs = paginator.get_page(page_num)#get_page方法处理用户输入的错误值 current_page_num = page_of_blogs.number#获得当前页 # 比较截取到想要的那个数到最小值1时用小的值和1作比较生成一个从小到当前的值 range_page = list(range(max(current_page_num-2,1),current_page_num))+\ list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1)) # range(当前到---->想要的那个值取到最后最小的那个值) #添加省略号 if range_page[0]-1>=2: range_page.insert(0,'...') if paginator.num_pages-range_page[-1]>=2: range_page.append('...') #添加首页和尾页 if range_page[0]!=1: range_page.insert(0,1) if range_page[-1]!=paginator.num_pages: range_page.append(paginator.num_pages) contenx = {} contenx['page_of_blogs'] = page_of_blogs contenx['blogs'] = page_of_blogs.object_list#获取符合参数所有的文章 # contenx['count'] = Blog.objects.all().count() contenx['range_page'] = range_page contenx['blogtypes'] = Blogtype.objects.all()#获取所有的分类 return render_to_response('blog/list.html',contenx)
四、分类列表页面展示:
def blog_with_type(request,typename_pk): contenx ={} typename = get_object_or_404(Blogtype,pk = typename_pk)#拿到传入的类型参数 blogs = Blog.objects.filter(typename=typename)#筛选的页面 paginator = Paginator(blogs,2)#每10篇文章分一页 page_num = request.GET.get('page',1)#GET方法获得url参数?page1 page是参数需要带引号 page_of_blogs = paginator.get_page(page_num)#get_page方法处理用户输入的错误值 current_page_num = page_of_blogs.number#获得当前页 # 比较截取到想要的那个数到最小值1时用小的值和1作比较生成一个从小到当前的值 range_page = list(range(max(current_page_num-2,1),current_page_num))+\ list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1)) # range(当前到---->想要的那个值取到最后最小的那个值) #添加省略号 if range_page[0]-1>=2: range_page.insert(0,'...') if paginator.num_pages-range_page[-1]>=2: range_page.append('...') #添加首页和尾页 if range_page[0]!=1: range_page.insert(0,1) if range_page[-1]!=paginator.num_pages: range_page.append(paginator.num_pages) contenx['page_of_blogs'] = page_of_blogs contenx['blogs'] = page_of_blogs.object_list#获取符合参数所有的文章 # contenx['count'] = Blog.objects.all().count() contenx['range_page'] = range_page contenx['typename'] = typename#显示分类列 contenx['blogtypes']= Blogtype.objects.all()#获取所有的分类 return render_to_response('blog/blog_with_type.html',contenx)
五、每页显示数量参数设置:
在settings里面设置后(大写)引入模块。
from django.conf import settings