分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置。

确定分页需求:

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页

效果图:

首先,利用django内置的分页功能,写分页类:

 from django.core.paginator import Paginator, Page      # 导入django分页模块

 class PageInfo(object):
def __init__(self, current_page, all_count, base_url, per_page=10, show_page=11):
""" :param current_page: 当前页
:param all_count: 总页数
:param base_url: 模板
:param per_page: 每页显示数据条数
:param show_page: 显示链接页个数
"""
#若url错误,默认显示第一页(错误类型可能为:空页面编号,非整数型页面编号)
try:
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1 #根据数据库信息条数得出总页数
a, b = divmod(all_count, per_page)
if b:
a += 1
self.all_page = a self.base_url = base_url
self.per_page = per_page
self.show_page = show_page #当前页起始数据id
def start_data(self):
return (self.current_page - 1) * self.per_page #当前页结束数据id
def end_data(self):
return self.current_page * self.per_page #动态生成前端html
def pager(self):
page_list = []
half = int((self.show_page - 1)/2)
#如果:总页数 < show_page,默认显示页数范围为: 1~总页数
if self.all_page < self.show_page:
start_page = 1
end_page = self.all_page + 1
#如果:总页数 > show_page
else:
#如果:current_page - half <= 0,默认显示页数范围为:1~show_page
if self.current_page <= half:
start_page = 1
end_page = self.show_page + 1
else:
#如果:current_page + half >总页数,默认显示页数范围为:总页数 - show_page ~ 总页数
if self.current_page + half > self.all_page:
end_page = self.all_page + 1
start_page = end_page - self.show_page
else:
start_page = self.current_page - half
end_page = self.current_page + half + 1 #首页
first_page = "<li><a href='%s?page=%s'>首页</a></li>" %(self.base_url, 1)
page_list.append(first_page) #上一页(若当前页等于第一页,则上一页无链接,否则链接为当前页减1)
if self.current_page <= 1:
prev_page = "<li><a href='#'>上一页</a></li>"
else:
prev_page = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url, self.current_page-1)
page_list.append(prev_page) #动态生成中间页数链接
for i in range(start_page, end_page):
if i == self.current_page:
temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url, i, i)
else:
temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i)
page_list.append(temp) #下一页(若当前页等于最后页,则下一页无链接,否则链接为当前页加1)
if self.current_page >= self.all_page:
next_page = "<li><a href='#'>下一页</a></li>"
else:
next_page = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url, self.current_page+1)
page_list.append(next_page) #末页(若总页数只有一页,则无末页标签)
if self.all_page > 1:
last_page = "<li><a href='%s?page=%s'>末页</a></li>" % (self.base_url, self.all_page)
page_list.append(last_page) return ''.join(page_list)

然后,在views中写方法(此处写在app01中):

 from utils.pagnition import PageInfo    # 从文件中导入上步自定义的分页模块

 def custom(request):
all_count = models.UserInfo.objects.all().count() # 获取要显示数据库的总数据条数
page_info = PageInfo(request.GET.get('page'), all_count, '/custom.html/',) # 生成分页对象
user_list = models.UserInfo.objects.all()[page_info.start_data():page_info.end_data()] # 利用分页对象获取当前页显示数据
return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info}) # 模板渲染

然后,在templates目录下写“custom.html"文件:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>customers</title>
{# 引入bootstrap样式#}
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<h1>customers</h1>
{#当前页显示的数据#}
<ul>
{% for row in user_list %}
<li>{{ row.name }}</li>
{% endfor %}
</ul> {#分页#}
<nav aria-label="Page navigation">
<ul class="pagination">
{# 传入page_info.pager#}
{{ page_info.pager|safe }}
</ul>
</nav> </body>
</html>

最后,新增url关系(urls.py):

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

至此,就完成了利用django的分页功能自定义分页模块,可以应用在不同的业务页面上。

参考资料:

1. Python之路【第十七篇】:Django【进阶篇 】

Django—自定义分页的更多相关文章

  1. Django自定义分页并保存搜索条件

    Django自定义分页并保存搜索条件 1.自定义分页组件pagination.py import copy class Pagination: def __init__(self, current_p ...

  2. Django自定义分页、bottle、Flask

    一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...

  3. Django 自定义分页类

    分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...

  4. Django - 自定义分页、FBV和CBV

    一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...

  5. Django——自定义分页(可调用)

    1.view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models ...

  6. django 自定义分页,网址存储缓存,CBV

    1. 通过切片控制分页 自定义分页: from django.shortcuts import render # Create your views here. from app01.models i ...

  7. Django自定义分页

    分页 自定义分页 稳扎稳打版 def book(request): # 从URL取参数(访问的页码) page_num = request.GET.get("page") try: ...

  8. django自定义分页控件

    1.准备数据 在models创建测试表 from django.db import models class Host(models.Model): hostname = models.CharFie ...

  9. Django 自定义分页

    1.路由 urls.py url(r'^index2.html/', views.index2), 2.views.py def index2(request): # 数据总条数 当前页 每页显示条数 ...

随机推荐

  1. MVC 提交List 集合 注意对应的参数名称

    public void AddMovieInfos(List<MoviesInfo> movies) { foreach (var item in movies) { dal.Add(it ...

  2. Comparable比较器和Comparator比较器

    1.Comparable比较器 在Arrays类中存在sort()排序方法,此方法可以直接对对象数组进行排序. public static void sort(Object[] a 根据元素的自然顺序 ...

  3. POJ_2886 Who Gets the Most Candies? 【二分+树状数组】

    一.题目 POJ2886 二.分析 这个题目吧,开始没读懂,做的时候也没懂,WA的时候懂了.假设是第p个出圈的人有一个对应的因子个数$F(p)$,那么,题目求的就是这个$F(p)$最大的对应的人. 1 ...

  4. bzoj 3261 最大异或和 可持久化字典树(01树)

    题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...

  5. 剑指offer——链表

    #include"stdio.h" #include"stdlib.h" #include"iostream" using namespac ...

  6. Kong在windows10的hyperV CentOS上安装

    1.启用hyperV manager 2.下载CentOS 3.给CentOS共享网络,添加Legacy NetWork Adapter 4.启动CentOS后安装kong(官网可查) 5.安装Pos ...

  7. springboot pom.xml文件

    pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  8. 如何下载Red Hat Enterprise Linux系统

    关于如何下载Red Hat Enterprise Linux系统? 这是一个既简单,又复杂的问题.简单是因为我以为她很简单,复杂是因为下载的过程有点复杂的. 相信去Oracle官网下载过东西的同学对下 ...

  9. 快速掌握用python写并行程序

    目录 一.大数据时代的现状 二.面对挑战的方法 2.1 并行计算 2.2 改用GPU处理计算密集型程序 3.3 分布式计算 三.用python写并行程序 3.1 进程与线程 3.2 全局解释器锁GIL ...

  10. html控件

    checkbox val = "<li class='layer'><label><input type='checkbox' checked name='la ...