Django Paginator

Django 分页官方文档  https://docs.djangoproject.com/en/1.10/topics/pagination/

此分页方法没有限制显示出来的页码的个数,会显示全部的页码,待改进。

后端代码

由于代码是先object_list = model_obj.model.objects.all(),然后调用 paginator = Paginator(object_list, 2),如果数据量很大就会消耗很多的性能。

如果是这样呢写呢? paginator = Paginator(model_obj.model.objects.all(), 2)  这样能利用queryset的惰性机制吗? 

  1. 看了下Paginator源码,应该是可行的
  1. class Paginator(object):
  2.  
  3. def __init__(self, object_list, per_page, orphans=0,
  4. allow_empty_first_page=True):
  5. self.object_list = object_list
  6. self.per_page = int(per_page)
  7. self.orphans = int(orphans)
  8. self.allow_empty_first_page = allow_empty_first_page
  9.  
  10. def validate_number(self, number):
  11. """
  12. Validates the given 1-based page number.
  13. """
  14. try:
  15. number = int(number)
  16. except (TypeError, ValueError):
  17. raise PageNotAnInteger('That page number is not an integer')
  18. if number < 1:
  19. raise EmptyPage('That page number is less than 1')
  20. if number > self.num_pages:
  21. if number == 1 and self.allow_empty_first_page:
  22. pass
  23. else:
  24. raise EmptyPage('That page contains no results')
  25. return number
  26.  
  27. def page(self, number):
  28. """
  29. Returns a Page object for the given 1-based page number.
  30. """
  31. number = self.validate_number(number)
  32. bottom = (number - 1) * self.per_page
  33. top = bottom + self.per_page
  34. if top + self.orphans >= self.count:
  35. top = self.count
  36. return self._get_page(self.object_list[bottom:top], number, self)
  37.  
  38. def _get_page(self, *args, **kwargs):
  39. """
  40. Returns an instance of a single page.
  41.  
  42. This hook can be used by subclasses to use an alternative to the
  43. standard :cls:`Page` object.
  44. """
  45. return Page(*args, **kwargs)
  46.  
  47. @cached_property
  48. def count(self):
  49. """
  50. Returns the total number of objects, across all pages.
  51. """
  52. try:
  53. return self.object_list.count()
  54. except (AttributeError, TypeError):
  55. # AttributeError if object_list has no count() method.
  56. # TypeError if object_list.count() requires arguments
  57. # (i.e. is of type list).
  58. return len(self.object_list)
  59.  
  60. @cached_property
  61. def num_pages(self):
  62. """
  63. Returns the total number of pages.
  64. """
  65. if self.count == 0 and not self.allow_empty_first_page:
  66. return 0
  67. hits = max(1, self.count - self.orphans)
  68. return int(ceil(hits / float(self.per_page)))
  69.  
  70. @property
  71. def page_range(self):
  72. """
  73. Returns a 1-based range of pages for iterating through within
  74. a template for loop.
  75. """
  76. return six.moves.range(1, self.num_pages + 1)
  77.  
  78. QuerySetPaginator = Paginator # For backwards-compatibility.

Paginator 部分源码

  1.  
  1. #需要导入 的模块
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3.  
  4. def display_table_objs(request,app_name,table_name):
  5. print(app_name,'----',table_name)
  6. #获取数据库数据
  7. model_obj = king_admin.enabled_admins[app_name][table_name]
  8.  
  9. #分页
  10. object_list = model_obj.model.objects.all()
  11. paginator = Paginator(object_list, 2) # Show 2 contacts per page
  12. # paginator = JuncheePaginator(object_list, 1) # Show 2 contacts per page
  13.  
  14. page = request.GET.get('page')
  15. try:
  16. contacts = paginator.page(page)
  17. except PageNotAnInteger:
  18. # If page is not an integer, deliver first page.
  19. contacts = paginator.page(1)
  20. except EmptyPage:
  21. # If page is out of range (e.g. 9999), deliver last page of results.
  22. contacts = paginator.page(paginator.num_pages)
  23.  
  24. return render(request,'king_admin/table_objs.html',{"model_obj":model_obj,
  25. "query_sets":contacts,})

前端模板代码

其中的标签样式引用的Bootstrap的样式

  1. <ul class="pagination">
  2. {# topics.paginator.page_range 这个函数返回包含一个所有页码数的 range 对象 #}
  3. {# 即 range(1, topics.paginator.num_pages + 1) #}
  4. {% if query_sets.has_previous %}
  5. <li><a href="?page={{ query_sets.previous_page_number }}">上一页</a></li>
  6. {% else %}
  7. <li><span>没了</span></li>
  8. {% endif %}
  9. {% for page_number in query_sets.paginator.page_range %}
  10.  
  11. {% ifequal page_number query_sets.number %}
  12. <li class="disabled"><span>{{ page_number }}</span></li>
  13.  
  14. {% else %}
  15. <li ><a href="?page={{ page_number }}">{{ page_number }}</a></li>
  16.  
  17. {% endifequal %}
  18. {% endfor %}
  19.  
  20. {% if query_sets.has_next %}
  21. <li><a href="?page={{ query_sets.next_page_number }}">下一页</a></li>
  22. {% else %}
  23. <li><span>没了</span></li>
  24. {% endif %}
  25. </ul>

效果如下:

Django 之 Paginator 分页功能的更多相关文章

  1. Django——Paginator分页功能练习

    1.路由urls.py from django.contrib import admin from django.urls import path from app01.views import in ...

  2. Django实现简单分页功能

    使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到s ...

  3. Django自定制分页功能

    URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views ...

  4. 利用rest-framework实现django应用的分页功能

    自定义分页的类,继承 PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size ...

  5. Django 使用Paginator分页

    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger subclass_s = models.subclas ...

  6. 【原】django实现列表分页功能

    在view.py里添加分页查询方法: from django.http import JsonResponse from django.views.decorators.http import req ...

  7. Django,ajax实现表格增删查改,Django内置分页功能。

    1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...

  8. django内置分页功能扩展

    实现自定制页码数类型class myPaginator(Paginator): def __init__(self,curr_page,per_page_num,*args,**kwargs): se ...

  9. django网页的分页功能,大家如果有疑问请留言

    url文件 from django.contrib import admin from django.conf.urls import url from app01 import views urlp ...

随机推荐

  1. SQL must not be null(低级错误)

    提醒一下: 数据库数据源配置出错,也会发生这种低级错误的.

  2. 2017.2.12 开涛shiro教程-第七章-与Web集成

    2017.2.9 开涛shiro教程-第七章-与Web集成(一) 原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. ...

  3. 接口测试 rest-assured 使用指南

    转自:https://testerhome.com/topics/7060 原文:https://github.com/rest-assured/rest-assured/wiki/Usage本文gi ...

  4. HDU 3466 01背包变形

    给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...

  5. TP框架模板中ifelse

    {if $_username}<ul class="afterLogin">    <li class="username"><a ...

  6. [魅族Degao]Androidclient性能优化

    本文由魅族科技有限公司资深Android开发project师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的A ...

  7. Mybatis无法扫描到mapper.xml文件

    在Mybatis中默认扫描与mapper包同路径下的xml,resource文件的文件夹名称不能一次性创建,如com.baidu.mapper需要创建3次 这里如果是idea开发工具,一次创建与分开创 ...

  8. 超出用省略号function()

    //判断是否微信浏览器 function isWeiXin() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/M ...

  9. dede频道标签channel和频道内容标签channelartlist的调用栏目名的不同方式,如果错误使用标签会发生错误

    频道标签 [field:typename/] 频道内容标签 {dede:field name='typename'/}

  10. Java系统中如何拆分同步和异步

    很多开发人员说,将应用程序切换到异步处理很复杂.因为他们有一个天然需要同步通信的Web应用程序.在这篇文章中,我想介绍一种方法来达到异步通信的目的:使用一些众所周知的库和工具来设计他们的系统. 下面的 ...