分页

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. JAVA 获取时间段内的每一天

    public class day { public static void main(String[] args) { // TODO Auto-generated method stub Strin ...

  2. 简单使用AspectJ

    AspectJ是一个AOP框架,由于SpringAOP的配置过于繁琐,因此使用了AspectJ依赖注解开发 1.Aspecj依赖坐标,此处省略了Spring相关依赖 <dependency> ...

  3. Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

    Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...

  4. C#使用iTextSharp给PDF文件加水印

    给PDF添加水印,可以用iTextSharp. 步骤1:下载iTextSharp 步骤2:在项目中添加引用itextsharp.dll 步骤3:在程序中使用iTextSharp.text.pdf us ...

  5. npm init,npm -y, npm install --save,npm install --save-dev

    npm init 初始化一个简单的package.json文件,执行该命令后终端会依次询问 name, version, description 等字段 npm init --yes|-y 作用同上, ...

  6. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  7. NOIP 2016 组合数问题 题解

    一道sb题目,注意范围,可打表解决,打出杨辉三角,在用前缀和求解即可 代码(一维前缀和) #include<bits/stdc++.h> using namespace std; int ...

  8. adb 端口冲突

    第一种方法:可以设置另一个端口 第二种方法: http://blog.csdn.net/hwl1314/article/details/52538023 Android studio 5037端口被占 ...

  9. 简单粗暴详细讲解javascript实现函数柯里化

    函数柯里化(黑人问号脸)???Currying(黑人问号脸)???妥妥的中式翻译既视感:下面来一起看看究竟什么是函数柯里化: 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第 ...

  10. Jmeter 之 逻辑控制器 if 控制器

    最近工作不忙,利用空闲时间整理了下Jmeter的相关知识,下面给大家分享下Jmeter中 如果(if)控制的使用和应用. 如下图:线程组 > 添加 > 逻辑控制器 > 如果 (if) ...