Django 之 Paginator 分页功能
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的惰性机制吗?
- 看了下Paginator源码,应该是可行的
- class Paginator(object):
- def __init__(self, object_list, per_page, orphans=0,
- allow_empty_first_page=True):
- self.object_list = object_list
- self.per_page = int(per_page)
- self.orphans = int(orphans)
- self.allow_empty_first_page = allow_empty_first_page
- def validate_number(self, number):
- """
- Validates the given 1-based page number.
- """
- try:
- number = int(number)
- except (TypeError, ValueError):
- raise PageNotAnInteger('That page number is not an integer')
- if number < 1:
- raise EmptyPage('That page number is less than 1')
- if number > self.num_pages:
- if number == 1 and self.allow_empty_first_page:
- pass
- else:
- raise EmptyPage('That page contains no results')
- return number
- def page(self, number):
- """
- Returns a Page object for the given 1-based page number.
- """
- number = self.validate_number(number)
- bottom = (number - 1) * self.per_page
- top = bottom + self.per_page
- if top + self.orphans >= self.count:
- top = self.count
- return self._get_page(self.object_list[bottom:top], number, self)
- def _get_page(self, *args, **kwargs):
- """
- Returns an instance of a single page.
- This hook can be used by subclasses to use an alternative to the
- standard :cls:`Page` object.
- """
- return Page(*args, **kwargs)
- @cached_property
- def count(self):
- """
- Returns the total number of objects, across all pages.
- """
- try:
- return self.object_list.count()
- except (AttributeError, TypeError):
- # AttributeError if object_list has no count() method.
- # TypeError if object_list.count() requires arguments
- # (i.e. is of type list).
- return len(self.object_list)
- @cached_property
- def num_pages(self):
- """
- Returns the total number of pages.
- """
- if self.count == 0 and not self.allow_empty_first_page:
- return 0
- hits = max(1, self.count - self.orphans)
- return int(ceil(hits / float(self.per_page)))
- @property
- def page_range(self):
- """
- Returns a 1-based range of pages for iterating through within
- a template for loop.
- """
- return six.moves.range(1, self.num_pages + 1)
- QuerySetPaginator = Paginator # For backwards-compatibility.
Paginator 部分源码
- #需要导入 的模块
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- def display_table_objs(request,app_name,table_name):
- print(app_name,'----',table_name)
- #获取数据库数据
- model_obj = king_admin.enabled_admins[app_name][table_name]
- #分页
- object_list = model_obj.model.objects.all()
- paginator = Paginator(object_list, 2) # Show 2 contacts per page
- # paginator = JuncheePaginator(object_list, 1) # Show 2 contacts per page
- page = request.GET.get('page')
- try:
- contacts = paginator.page(page)
- except PageNotAnInteger:
- # If page is not an integer, deliver first page.
- contacts = paginator.page(1)
- except EmptyPage:
- # If page is out of range (e.g. 9999), deliver last page of results.
- contacts = paginator.page(paginator.num_pages)
- return render(request,'king_admin/table_objs.html',{"model_obj":model_obj,
- "query_sets":contacts,})
前端模板代码
其中的标签样式引用的Bootstrap的样式
- <ul class="pagination">
- {# topics.paginator.page_range 这个函数返回包含一个所有页码数的 range 对象 #}
- {# 即 range(1, topics.paginator.num_pages + 1) #}
- {% if query_sets.has_previous %}
- <li><a href="?page={{ query_sets.previous_page_number }}">上一页</a></li>
- {% else %}
- <li><span>没了</span></li>
- {% endif %}
- {% for page_number in query_sets.paginator.page_range %}
- {% ifequal page_number query_sets.number %}
- <li class="disabled"><span>{{ page_number }}</span></li>
- {% else %}
- <li ><a href="?page={{ page_number }}">{{ page_number }}</a></li>
- {% endifequal %}
- {% endfor %}
- {% if query_sets.has_next %}
- <li><a href="?page={{ query_sets.next_page_number }}">下一页</a></li>
- {% else %}
- <li><span>没了</span></li>
- {% endif %}
- </ul>
效果如下:
Django 之 Paginator 分页功能的更多相关文章
- Django——Paginator分页功能练习
1.路由urls.py from django.contrib import admin from django.urls import path from app01.views import in ...
- Django实现简单分页功能
使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到s ...
- Django自定制分页功能
URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views ...
- 利用rest-framework实现django应用的分页功能
自定义分页的类,继承 PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size ...
- Django 使用Paginator分页
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger subclass_s = models.subclas ...
- 【原】django实现列表分页功能
在view.py里添加分页查询方法: from django.http import JsonResponse from django.views.decorators.http import req ...
- Django,ajax实现表格增删查改,Django内置分页功能。
1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...
- django内置分页功能扩展
实现自定制页码数类型class myPaginator(Paginator): def __init__(self,curr_page,per_page_num,*args,**kwargs): se ...
- django网页的分页功能,大家如果有疑问请留言
url文件 from django.contrib import admin from django.conf.urls import url from app01 import views urlp ...
随机推荐
- SQL must not be null(低级错误)
提醒一下: 数据库数据源配置出错,也会发生这种低级错误的.
- 2017.2.12 开涛shiro教程-第七章-与Web集成
2017.2.9 开涛shiro教程-第七章-与Web集成(一) 原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. ...
- 接口测试 rest-assured 使用指南
转自:https://testerhome.com/topics/7060 原文:https://github.com/rest-assured/rest-assured/wiki/Usage本文gi ...
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
- TP框架模板中ifelse
{if $_username}<ul class="afterLogin"> <li class="username"><a ...
- [魅族Degao]Androidclient性能优化
本文由魅族科技有限公司资深Android开发project师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的A ...
- Mybatis无法扫描到mapper.xml文件
在Mybatis中默认扫描与mapper包同路径下的xml,resource文件的文件夹名称不能一次性创建,如com.baidu.mapper需要创建3次 这里如果是idea开发工具,一次创建与分开创 ...
- 超出用省略号function()
//判断是否微信浏览器 function isWeiXin() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/M ...
- dede频道标签channel和频道内容标签channelartlist的调用栏目名的不同方式,如果错误使用标签会发生错误
频道标签 [field:typename/] 频道内容标签 {dede:field name='typename'/}
- Java系统中如何拆分同步和异步
很多开发人员说,将应用程序切换到异步处理很复杂.因为他们有一个天然需要同步通信的Web应用程序.在这篇文章中,我想介绍一种方法来达到异步通信的目的:使用一些众所周知的库和工具来设计他们的系统. 下面的 ...