项目中,我们需要很多非业务逻辑的功能,例如分页功能,而且此类功能移植性很好,可以在不同的项目中使用,所以整理好这些功能会一定程度上提高开发效率,下面是分页功能代码,使用时,可单独放在utils目录
"""
使用方法: from utils.page import Pagination
def users(request):
current_page = int(request.GET.get('page',1)) total_item_count = models.UserInfo.objects.all().count()
# page_obj = Pagination(current_page,total_item_count,request.path_info)
# request.path_info,当前请求的页面,也可以直接把请求页面写上,如下
page_obj = Pagination(current_page,total_item_count,'/users.html') user_list = models.UserInfo.objects.all()[page_obj.start:page_obj.end] return render(request,'users.html',{'user_list':user_list,'page_html':page_obj.page_html()}) """ from django.utils.safestring import mark_safe class Pagination(object): def __init__(self,current_page,total_item_count,base_url,per_page_count=10,show_pager_count=11):
"""
:param current_page: 当前页
:param total_item_count: 数据库数据总条数
:param base_url: 分页前缀URL
:param per_page_count: 每页显示数据条数
:param show_pager_count: 对多显示的页码
"""
self.current_page = current_page
self.total_item_count = total_item_count
self.base_url = base_url
self.per_page_count = per_page_count
self.show_pager_count = show_pager_count max_pager_num, b = divmod(total_item_count, per_page_count)
if b:
max_pager_num += 1
self.max_pager_num = max_pager_num @property
def start(self):
""" :return:
"""
return (self.current_page-1)* self.per_page_count @property
def end(self):
""" :return:
"""
return self.current_page * self.per_page_count def page_html(self):
""" :return:
"""
page_list = [] if self.current_page == 1:
prev = ' <li><a href="#">上一页</a></li>'
else:
prev = ' <li><a href="%s?page=%s">上一页</a></li>' % (self.base_url,self.current_page - 1,)
page_list.append(prev) half_show_pager_count = int(self.show_pager_count / 2) # 数据特别少,15条数据=2页
if self.max_pager_num < self.show_pager_count:
# 页码小于11
pager_start = 1
pager_end = self.max_pager_num + 1
else:
if self.current_page <= half_show_pager_count:
pager_start = 1
pager_end = self.show_pager_count + 1
else:
if self.current_page + half_show_pager_count > self.max_pager_num:
pager_start = self.max_pager_num - self.show_pager_count + 1
pager_end = self.max_pager_num + 1
else:
pager_start = self.current_page - half_show_pager_count
pager_end = self.current_page + half_show_pager_count + 1 for i in range(pager_start, pager_end):
if i == self.current_page:
tpl = ' <li class="active"><a href="%s?page=%s">%s</a></li>' % (self.base_url,i, i,)
else:
tpl = ' <li><a href="%s?page=%s">%s</a></li>' % (self.base_url,i, i,)
page_list.append(tpl) if self.current_page == self.max_pager_num:
nex = ' <li><a href="#">下一页</a></li>'
else:
nex = ' <li><a href="%s?page=%s">下一页</a></li>' % (self.base_url,self.current_page + 1,)
page_list.append(nex) return mark_safe(''.join(page_list)

  

 
 
应用:
 
创建300条数据
 
页面显示

 
用get请求发送页码(get请求,直接在url后面加上"?page=n"就好了)

 
调用上面的页码类,写好视图函数
 
前端页面很简单就能显示出来页码

 

 
思路:
显示所有——按页显示(每页的起始结束项)——显示页码——当前页样式——上页下页——显示十个页码(当前页前后各五个)——页码前后极限处理

 

Django【进阶】分页功能Pagination的更多相关文章

  1. 项目中的一个分页功能pagination

    项目中的一个分页功能pagination <script> //总页数 ; ; //分页总数量 $(function () { // $("#pagination"). ...

  2. Django之分页功能

    Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表.元组或其它可迭代的对象. 基本语法 class Paginator(ob ...

  3. Django 实现分页功能(django 2.2.7 python 3.7.5 )

    Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能.本文就讲解如何使用 Paginator 实现分页功能. 一. Paginator Paginator 类的作用是将我们需 ...

  4. WEB框架之Django实现分页功能

    一 Paginator分页器 1 首先在数据库中生成大量数据 def index(request) book_list = [] for i in rang(1000) book = Book(tit ...

  5. django 实现分页功能

    分页效果: 视图代码: # -*- coding: utf-8 -*- from django.shortcuts import render,get_object_or_404 from djang ...

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

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

  7. django 添加分页功能的包

    Django pagination based upon the core pagination module

  8. Django学习笔记(12)——分页功能

    这一篇博客记录一下自己学习Django中分页功能的笔记.分页功能在每个网站都是必要的,当页面因需要展示的数据条目过多,导致无法全部显示,这时候就需要采用分页的形式进行展示. 分页在网站随处可见,下面展 ...

  9. Django—自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...

随机推荐

  1. [C/C++] 结构体存储问题

    64位操作系统,不同类型变量对应的字节数为: char : 1个字节 char*(即指针变量) : 8个字节 //32位占4个字节 short int : 2个字节 int : 4个字节 unsign ...

  2. ASP.Net MVC+Ibaties架构

    1.配置Ibaties首先在DLL引用中添加Ibaties相关引用:IBatisNet.Common.dll;IBatisNet.Common.Logging.Log4Net.dll;IBatisNe ...

  3. 在js中对日期的加减法

    以在某个日期上加减天数来说,其实只要调用Date对象的setDate()函数就可以了,对月份来说,使用setMonth(),具体方法如下:      function addDate(date, da ...

  4. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  5. CentOS 安装tomcat

    1.确保JDK已经安装,版本在1.8以上 2.到网管下载安装 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0. ...

  6. BZOJ2223:[Coci2009]PATULJCI——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2223 Description Sample Input 10 3 1 2 1 2 1 2 3 2 3 ...

  7. 洛谷 P2272 [ZJOI2007]最大半连通子图 解题报告

    P2272 [ZJOI2007]最大半连通子图 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v \in V\),满 ...

  8. NOIP系列

    NOIP2015运输计划 唉 真是 这题 卡死我了 tarjan离线lca复杂度O(n) 最后各种卡常,多交几遍才A(洛谷104ms) %%%zk学长609ms 注意二分的时候左边界要定成0 根据题意 ...

  9. bzoj 1098 [POI2007]办公楼biu bfs+补图+双向链表

    [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1543  Solved: 743[Submit][Status][Di ...

  10. JQuery学习一

    第一个JQuery程序 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...