分页

1.简单分页

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^index.html$', views.index),
]

project/urls.py

from django.shortcuts import render,HttpResponse,redirect

USER_LIST = []
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp) def index(request):
per_page_count = 10
current_page = request.GET.get('p')
current_page = int(current_page)
#p=1 索引 0,10 0-9
#p=2 索引10,20 10-19
start = (current_page-1) * per_page_count
end = (current_page) * per_page_count
data = USER_LIST[start:end]
prev_page = current_page -1
next_page = current_page +1
return render(request,'index.html',{'user_list':data,'prev_page':prev_page,'next_page':next_page})

app01/views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
{% for row in user_list %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul> <a href="/index.html?p={{ prev_page }}">上一页</a>
<a href="/index.html?p={{ next_page }}">下一页</a>
</body>
</html>

templates/index.html

展示效果:

2.django内置分页

传入:
- 所有数据
- 当前页
- 每页显示10条
- 最多页面11个

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^index1.html$', views.index1),
]

project/urls.py

from django.shortcuts import render,HttpResponse,redirect
from django.core.paginator import EmptyPage, Paginator,PageNotAnInteger USER_LIST = []
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp) #django内置分页
def index1(request):
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
current_page = request.GET.get('p')
#paginator对象
paginator = Paginator(current_page,11,USER_LIST,10) #每页10条数据
try:
posts = paginator.page(current_page)
#age对象
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表,已经切片好的数据
# number 当前页
# paginator paginator对象
except PageNotAnInteger: #不是整数
posts = paginator.page(1)
except EmptyPage: #空页
posts = paginator.page(paginator.num_pages) #超出总页数,内容显示总页数
return render(request,'index1.html',{'posts':posts})

app01/views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
{% for row in posts.object_list %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul>
{% include 'include/pager.html' %} </body>
</html>

templates/index1.html

{% if posts.has_previous %}
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
{% endif %} {% if posts.has_next %}
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% else %}
<a href="#">下一页</a>
{% endif %} <apan>
{{ posts.number }}/{{ posts.paginator.num_pages }}
</apan>

temlplates/include/pager.html

展示效果:

扩展内置分页:

from django.shortcuts import render,HttpResponse,redirect
from django.core.paginator import EmptyPage, Paginator,PageNotAnInteger USER_LIST = []
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp) class CustomPaginator(Paginator):
def __init__(self, current_page,per_page_number,*args, **kwargs):
#当前页
self.current_page = int(current_page)
#最多显示页码数11
self.per_page_number = int(per_page_number)
super(CustomPaginator, self).__init__(*args, **kwargs) def page_num_range(self):
# self.current_page 当前页
# self.per_page_number 最多显示页码数11
# self.num_pages 总页数
if self.num_pages < self.per_page_number: # 总页数<11
return range(1,self.num_pages+1) # 遍历(1,总页数+1)
part = int(self.per_page_number/2)
if self.current_page <= part: # 当前页 <= 5
return range(1,self.per_page_number+1) # 遍历(1,11+1)
if (self.current_page+part) >= self.num_pages: #当前页+5 >=总页数
return range(self.num_pages-self.per_page_number,self.num_pages+1) # 遍历(总页数-11,总页数+1)
return range(self.current_page-part,self.current_page+part+1) #django内置分页
def index1(request):
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
current_page = request.GET.get('p')
#paginator对象
paginator = CustomPaginator(current_page,11,USER_LIST,10) #每页10条数据
try:
posts = paginator.page(current_page)
#age对象
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表,已经切片好的数据
# number 当前页
# paginator paginator对象
except PageNotAnInteger: #不是整数
posts = paginator.page(1)
except EmptyPage: #空页
posts = paginator.page(paginator.num_pages) #超出总页数,内容显示总页数
return render(request,'index1.html',{'posts':posts})

app01/views.py #扩展

{% if posts.has_previous %}
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
{% endif %} {% for i in posts.paginator.page_num_range %}
{% if i == posts.number %}
<a style="font-size: 30px" href="/index1.html?p={{ i }}">{{ i }}</a>
{% else %}
<a href="/index1.html?p={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %} {% if posts.has_next %}
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% else %}
<a href="#">下一页</a>
{% endif %} <apan>
{{ posts.number }}/{{ posts.paginator.num_pages }}
</apan>

temlplates/include/pager.html #扩展

效果展示:

3,自定制分页

传入:
- 所有数据个数
- 当前页
- 每页显示10条
- 最多页面11个

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^index2.html$', views.index2),
]

project/views.py

def index2(request):
from app01.pager import Pagination
# 传入:
# - 所有数据的个数
# - 当前页
# - 每页显示30条
# - 最多页面7个
current_page = request.GET.get('p')
page_obj = Pagination(666, current_page)
data_list = USER_LIST[page_obj.start():page_obj.end()]
return render(request, 'index2.html', {'data': data_list, 'page_obj': page_obj})

app01/views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"/>
</head>
<body> <ul>
{% for row in data %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul>
{% for i in page_obj.page_num_range %}
<a href="/index2.html?p={{ i}}">{{ i }}</a>
{% endfor %}
<hr/> <ul class="pagination pagination-sm">
{{ page_obj.page_str|safe }}
</ul>
<div style="height: 300px"></div> </body>
</html>

templates/index2.html

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:daly class Pagination(object):
def __init__(self,totalCount,currentPage,perPageItemNum=10,maxPageNum=7):
self.total_count= totalCount #数据总个数
try:
v = int(currentPage) #当前页
if v <= 0:
v = 1
self.current_page = v
except Exception as e:
self.current_page = 1
self.per_page_item_num = perPageItemNum #每页显示个数
self.max_page_num = maxPageNum #最多显示页数 def start(self):
return (self.current_page-1) * self.per_page_item_num def end(self):
return self.current_page * self.per_page_item_num @property
def num_pages(self):
#总页数
a,b = divmod(self.total_count,self.per_page_item_num)
if b == 0:
return a
return a + 1 def page_num_range(self):
# self.current_page 当前页
# self.max_page_num 最多显示页码数
# self.num_pages 总页数
if self.num_pages < self.max_page_num:
return range(1,self.num_pages+1)
part = int(self.max_page_num/2)
if self.current_page <= part:
return range(1,self.max_page_num+1)
if (self.current_page+part) >= self.num_pages:
return range(self.num_pages-self.max_page_num,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1) def page_str(self):
page_list = [] first = "<li><a href='/index2.html?p=1'>首页</a></li>"
page_list.append(first) if self.current_page == 1:
perv = "<li><a href='#'>上一页</a></li>"
else:
perv = "<li><a href='/index2.html?p=%s'>上一页</a></li>" %(self.current_page-1,)
page_list.append(perv) for i in self.page_num_range():
if i == self.current_page:
temp = "<li class='active'><a href='/index2.html?p=%s'>%s</a></li>"%(i,i)
else:
temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
page_list.append(temp) if self.current_page == self.num_pages:
nex = "<li><a href='#'>下一页</a></li>"
else:
nex = "<li><a href='/index2.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
page_list.append(nex) last = "<li><a href='/index2.html?p=%s'>尾页</a></li>"%(self.num_pages,)
page_list.append(last) return ''.join(page_list)

app01/pager.py

展示效果:

【django】分页的更多相关文章

  1. django 分页(2) 使用类 页码显示

    django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...

  2. Django 分页功能

    Django 分页功能比较强大,这边是结合官网的内容写的可以参考 https://docs.djangoproject.com/en/1.9/topics/pagination/ 分页命令行练习案列 ...

  3. 原生的 django 分页

    原始的 django 分页 # 基本 写法 class Paginator(object): def __init__(self, object_list, per_page, orphans=0, ...

  4. django 分页组件

      一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...

  5. Django分页(二)

    Django分页(二) 要求 .设定每页显示数据条数 # # .用户输入页码(第一页.第二页...) # # .设定显示多少页号 # # .获取当前数据总条数 # # .根据设定显示多少页号和数据总条 ...

  6. Django分页(一)

    Django分页(一) 手动实现简单分页 HTML <!DOCTYPE html> <html lang="en"> <head> <me ...

  7. django 分页出现 UnorderedObjectListWarning 错误

    django 分页出现此错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unorde ...

  8. 2019.03.20 mvt,Django分页

    MVT模式   MVT各部分的功能:   M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理.       V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返 ...

  9. Django分页类的封装

    Django分页类的封装 Django ORM  封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...

  10. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

随机推荐

  1. Gym - 101667H - Rock Paper Scissors FFT 求区间相同个数

    Gym - 101667H:https://vjudge.net/problem/Gym-101667H 参考:https://blog.csdn.net/weixin_37517391/articl ...

  2. 并发、线程的基本概念&线程启动结束

    并发.进程.可执行程序.进程.线程的基本概念 1.并发 并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段 ...

  3. 杭电多校第九场 D Rikka with Stone-Paper-Scissors 数学

    Rikka with Stone-Paper-Scissors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/52428 ...

  4. KDTree 板子

    从杨哥哪里偷的板子, 存一下. #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.t ...

  5. 模板汇总——Tarjian

    1. 单向边  + 新图建边 int belong[N], dfn[N], low[N], now_time, scc_cnt; stack<int> s; void dfs(int u) ...

  6. CodeForces div3 第一场

    A Wrong Subtraction 题意: 对于一个数操作n次,操作如下: 如果末尾是0就将这个数除以10, 如果末尾不是0就将这个数-1, 直接做就好了. 代码: #include<bit ...

  7. codeforces 805 D. Minimum number of steps(数学)

    题目链接:http://codeforces.com/contest/805/problem/D 题意:只有一个操作就是将ab变成bba直到不能变为止,问最少边几次. 题解:这题可以多列几组来找规律, ...

  8. Bytes类型

    Bytes类型 一.定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型. b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' ''' ...

  9. yzoj P2044 数字游戏 题解

    题意 dfs骗了30分,一开始想的距离正解差一点啊,贪心加dp就可以过的水题,真正太蒻了 解析 代码 #include<bits/stdc++.h> using namespace std ...

  10. Cookie与Seesion的作用

    1.什么是Cookie与Session? cookie:首次访问服务器,服务器返回cookie置浏览器,存到用户电脑.之后去访问同一服务器,浏览器会携带相应cookie判断是否是同一浏览器的访问,告知 ...