Django提供了一些类来管理分页的数据,类位于django/core/paginator.py中
from django.core.paginator import Paginator objects=[] for i in range(20): objects.append("图书%s"%i) p=Paginator(objects,4) #每页的个数 print(p.count) #数据总数 print(p.num_pages) #总页数 print(p.page_range) #页码列表 print(p.page(1)) #第一页的对象 print(p.page(1).object_list) #['图书0', '图书1', '图书2', '图书3'] page2=paginator.page(2) print(page2.has_next()) #是否有下一页 print(page2.next_page_number()) #下一页的页码 print(page2.has_previous()) #是否有上一页 print(page2.previous_page_number()) #上一页的页码
1.在py中批量往数据库中加数据
##批量添加数据## objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)] # 在数据库中批量创建, 10次一提交 models.Book.objects.bulk_create(objs,10) ###将数据全部删除 # models.Book.obje
2.设置分页
HTML
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<div class="container"> <table class="table table-bordered"> <thead> <tr> <th>序号</th> <th>id</th> <th>书名</th> </tr> </thead> <tbody> {% for book in book_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ book.id }}</td> <td>{{ book.title }}</td> </tr> {% endfor %} </tbody> </table> {#分页条#} <nav aria-label="Page navigation"> <ul class="pagination"> {# 没有safe显示会有误 #} {{ page_html|safe }} </ul> </nav> </div>
在views设置分页
1.在页面上将所有数据均显示出来 book_obj=models.Book.objects.all() 2.每页显示5条数据 book_obj = models.Book.objects.all()[0:5] 3.在地址栏输入要显示的页面,显示出其数据 ?page=2 num=request.GET.get("page") #num是字符串 print(num,type(num)) num=int(num) start=(num-1)*5 end=num*5 book_obj = models.Book.objects.all()[start:end] return render(request
加上分页条来设置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
total_count = models.Book.objects.all().count() # 统计数据的数量 print("数量为{}".format(total_count)) per_page = 5 # 每页显示的数量 total_page, m = divmod(total_count, per_page) # 如果有余数,就要在得到的整数基础上再加1页 if m: total_page += 1 # 得到数字,不能直接给HTML ##自己拼接HTML代码 html_str_list = [] for i in range(1, total_page + 1): tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i) html_str_list.append(tmp) page_html = "".join(html_str_list) # 标签之间没有逗号 num = request.GET.get("page") # num是字符串 if num: num = int(num) else:num=1 #如果只在路径上输入/book_list/,不指定页数,就默认显示第一页 start = (num - 1) * 5 end = num * 5 book_obj = models.Book.objects.all()[start:end] return render(request,"book_list.html",{"book_list":book_obj,"page_html":page_html})
设置固定的页码数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
total_count = models.Book.objects.all().count() # 统计数据的数量 print("数量为{}".format(total_count)) per_page = 5 # 每页显示的数量 total_page, m = divmod(total_count, per_page) # 如果有余数,就要在得到的整数基础上再加1页 if m: total_page += 1 # 得到数字,不能直接给HTML num = request.GET.get("page") # num是字符串 if num: try: num = int(num) if num>total_page: num=total_page ##输入不是数字时,就返回第一页 except Exception as e: num=1 else: num = 1 # 如果只在路径上输入/book_list/,不指定页数,就默认显示第一页 start = (num - 1) * 5 end = num * 5 book_obj = models.Book.objects.all()[start:end] ##设置固定的页码数## max_page=11 if total_page<max_page: #如果页数小于11页 max_page=total_page half_page=max_page//2 #当前页前后的页数 #页面的开始页码 start_page=num-half_page end_page=num+half_page if start_page<=1: start_page=1 end_page=max_page if end_page>total_page: start_page=total_page-max_page+1 #如果不加1,会显示12个 end_page=total_page html_str_list = [] for i in range(start_page, end_page+1): tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i) html_str_list.append(tmp) page_html = "".join(html_str_list) return render(request, "book_list.h
添加首页和尾页,上一页和下一页
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
html_str_list = [] ##添加首页 html_str_list.append('<li><a href="/book_list/?page=1">首页</a></li>') ##添加上一页 if num<=1: #如果是页数小于等于1,就没有上一页,就不让选了 html_str_list.append('<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>') else: html_str_list.append('<li><a href="/book_list/?page={}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>'.format(num-1)) for i in range(start_page, end_page+1): ##如果是当前页,就加个样式类 if i == num: tmp = '<li class="active"><a href="/book_list/?page={0}">{0}</a></li>'.format(i) else: tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i) html_str_list.append(tmp) ##添加下一页 if num >=total_page: html_str_list.append('<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li>') else: html_str_list.append('<li ><a href="/book_list/?page={}" aria-label="Next"><span aria-hidden="true">»</span></a></li>'.format(num+1)) ##添加尾页 html_str_list.append('<li><a href="/book_list/?page={}">尾页</a></li>'.format(total_page)) page_html = "".join(html_str_list) return render(request, "book_list.html", {"book_list": book_obj, "page_html": page_html})
CBV版分页
page.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
""" 分页组件使用示例: obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info) page_user_list = USER_LIST[obj.start:obj.end] page_html = obj.page_html() return render(request,'index.html',{'users':page_user_list,'page_html':page_html}) """ class Pagination(object): def __init__(self,current_page,all_count,base_url,params,per_page_num=20,pager_count=11): """ 封装分页相关数据 :param current_page: 当前页 :param all_count: 数据库中的数据总条数 :param per_page_num: 每页显示的数据条数 :param base_url: 分页中显示的URL前缀 :param pager_count: 最多显示的页码个数 """ try: current_page = int(current_page) except Exception as e: current_page = 1 if current_page <1: current_page = 1 self.current_page = current_page self.all_count = all_count self.per_page_num = per_page_num self.base_url = base_url # 总页码 all_pager, tmp = divmod(all_count, per_page_num) if tmp: all_pager += 1 self.all_pager = all_pager self.pager_count = pager_count self.pager_count_half = int((pager_count - 1) / 2) # GET请求数据 import copy self.params=copy.deepcopy(params) # request.GET {"nid":1} @property def start(self): return (self.current_page - 1) * self.per_page_num @property def end(self): return self.current_page * self.per_page_num def page_html(self): # 如果总页码 < 11个: if self.all_pager <= self.pager_count: pager_start = 1 pager_end = self.all_pager + 1 # 总页码 > 11 else: # 当前页如果<=5 if self.current_page <= self.pager_count_half: pager_start = 1 pager_end = self.pager_count + 1 # 当前页大于5 else: # 页码翻到最后 if (self.current_page + self.pager_count_half) > self.all_pager: pager_start = self.all_pager - self.pager_count + 1 pager_end = self.all_pager + 1 else: pager_start = self.current_page - self.pager_count_half pager_end = self.current_page + self.pager_count_half + 1 page_html_list = [] page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">') first_page = '<li><a href="/%s?page=%s">首页</a></li>' % (self.base_url,1,) page_html_list.append(first_page) if self.current_page <= 1: prev_page = '<li class="disabled"><a href="#">上一页</a></li>' else: prev_page = '<li><a href="/%s?page=%s">上一页</a></li>' % (self.base_url,self.current_page - 1,) page_html_list.append(prev_page) for i in range(pager_start, pager_end): self.params["page"]=i if i == self.current_page: temp = '<li class="active"><a href="/%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,) else: temp = '<li><a href="/%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,) page_html_list.append(temp) if self.current_page >= self.all_pager: next_page = '<li class="disabled"><a href="#">下一页</a></li>' else: next_page = '<li><a href="/%s?page=%s">下一页</a></li>' % (self.base_url,self.current_page + 1,) page_html_list.append(next_page) last_page = '<li><a href="/%s?page=%s">尾页</a></li>' % (self.base_url,self.all_pager,) page_html_list.append(last_page) page_html_list.append('</ul></nav>') return ''.join(page_html_list)
HTML
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <ul> {% for book in book_list %} <li>{{ book.title }}----{{ book.price }}</li> {% endfor %} </ul> {{ pagination.page_html|safe }} </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from app01 import models def index(request): book_list=models.BooK.objects.all() from app01.page import Pagination current_page=request.GET.get("page") pagination=Pagination(current_page,book_list.count(),"index",request.GET,per_page_num=5) book_list=book_list[pagination.start:pagination.end] return render(request,"index.html",locals())
import pymysql conn =pymysql.connect(host="10.110.1.90", port=3306, user="php", password="MySQL57.huayingjuhe.com", database="fdm", charset="utf8mb4" ) cursor =conn.cursor(cursor=pymysql.cursors.DictCursor) def pageinfo(page=1, pagesize=20, total=0 ): """只显示五页的页码""" page = int(page) if page <= 0 : page = 1 pagesize = int(pagesize) if pagesize <= 0 : pagesize = 20 total = int(total) totalpage = abs(((-1) * total)// pagesize ) if page > totalpage and totalpage > 0: page = totalpage offset = (page - 1) * pagesize d = {"page" : page, "pagesize" : pagesize, "offset" : offset, "total" : total } d["first"] = 1 d["prev"] = page - 1 if(page > 1) else 1 d["next"] = page + 1 if(page < totalpage) else totalpage d["last"] = totalpage l = [] i = -4 while i < 5 : if page + i >= 1 and page +i <= totalpage : l.append(page + i ) i = i + 1 d["links"] = l return d def get_movie_projects(name=None, page=1,pagesize=20): """分页显示""" where = [" id > %s "] args = [0] if name != None : where.append(" and ( pid = %s or name like %s ) ") args.append(name) args.append('%'+name+'%') sql = "select count(*) as row_num from fdm_project where %s " % (''.join(where)) row = cursor.execute(sql,tuple(args,)) r = cursor.fetchall() total = r[0]["row_num"] page_info = pageinfo(page,pagesize,total) sql = "select * from fdm_project where %s order by id desc limit %s offset %s " % (''.join(where),page_info["pagesize"],page_info["offset"] ) row = cursor.execute(sql,tuple(args)) project = cursor.fetchall() return {"pageinfo":page_info,"project":project} print(get_movie_projects())