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">&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}}"><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">&raquo;</span>
                              </a>
                            {%else%}
                            <span aria-hidden="true">&raquo;</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">&laquo;</span>
                          </a>
                        {%else%}
                        <span aria-hidden="true">&laquo;</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">&raquo;</span>
                              </a>
                            {%else%}
                            <span aria-hidden="true">&raquo;</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

 

posted @ 2018-02-04 14:17  jeep-鹏  阅读(2842)  评论(1编辑  收藏  举报