Django分页功能的实现代码详解


Posted in Python onJuly 29, 2019

Django分页功能的实现

打开命令行窗口,创建Django工程,使用以下命令:

django-admin startproject djpage

cd djpage

python manage.py startapp demo

Django分页功能的实现代码详解

使用PyCharm打开工程,在工程的同名文件夹的settings.py文件,注册应用,添加模板路径,修改部分的settings.py内容如下:

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'demo.apps.DemoConfig'
]

TEMPLATES = [
  {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR,'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
      'context_processors': [
        'django.template.context_processors.debug',
        'django.template.context_processors.request',
        'django.contrib.auth.context_processors.auth',
        'django.contrib.messages.context_processors.messages',
      ],
    },
  },
]

Django分页功能的实现代码详解

在工程同名文件的urls.py文件,添加到应用的视图的路由

from django.conf.urls import url
from django.contrib import admin
from demo import views
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'page/(?P<id>\d+)/$',views.page)
]

Django分页功能的实现代码详解

在应用的视图views.py文件,编写处理请求函数,实现分页显示一个列表的内容,这里列表也可以是查询集

from django.shortcuts import render
from django.core.paginator import Paginator
# Create your views here.

def page(request,id):

  hello_list = [{'title':'hello'},{'title':'world'},
        {'title':'hello1'},{'title':'world1'},
        {'title':'hello2'},{'title':'world2'},
        {'title':'hello3'},{'title':'world3'},
        {'title':'hello4'},{'title':'world4'}]
  pag = Paginator(hello_list, 2)
  page = pag.page(int(id))
  return render(request,template_name='home.html', context={'page': page})

在工程根目录新建templates文件夹,并创建一个home.html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <ul>
    {% for item in page %}
    <li>{{item.title}}</li>
    {% endfor %}
  </ul>
  {% if page.has_previous %}
  <a href="/page/{{ page.previous_page_number }}" rel="external nofollow" rel="external nofollow" ><上一页</a>
  {% endif %}

  {# 遍历显示页码的链接 #}
  {% for index in page.paginator.page_range %}
  {# 判断是否是当前页 #}
    {% if index == page.number %}
      {{ index }}
    {% else %}
      <a href="/page/{{ index }}" rel="external nofollow" rel="external nofollow" >{{ index }}</a>
    {% endif %}
  {% endfor %}

  {# 判断是否有下一页 #}
  {% if page.has_next %}
    <a href="/page/{{ page.next_page_number }}" rel="external nofollow" rel="external nofollow" >下一页></a>
  {% endif %}

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <ul>
    {% for item in page %}
    <li>{{item.title}}</li>
    {% endfor %}
  </ul>
  {% if page.has_previous %}
  <a href="/page/{{ page.previous_page_number }}" rel="external nofollow" rel="external nofollow" ><上一页</a>
  {% endif %}

  {# 遍历显示页码的链接 #}
  {% for index in page.paginator.page_range %}
  {# 判断是否是当前页 #}
    {% if index == page.number %}
      {{ index }}
    {% else %}
      <a href="/page/{{ index }}" rel="external nofollow" rel="external nofollow" >{{ index }}</a>
    {% endif %}
  {% endfor %}

  {# 判断是否有下一页 #}
  {% if page.has_next %}
    <a href="/page/{{ page.next_page_number }}" rel="external nofollow" rel="external nofollow" >下一页></a>
  {% endif %}

</body>
</html>

page.paginator.page_range是页面总数

Django分页功能的实现代码详解

运行django服务器

python manage.py runserver

Django分页功能的实现代码详解

打开网页,输入

http://127.0.0.1:8000/page/1

显示效果图如下,分页成功

Django分页功能的实现代码详解

知识点扩展:

自定义分页的实例代码:

def book(request):
 # 从URL取参数(访问的页码)
 page_num = request.GET.get("page")
 try:
 # 将取出的page转换为int类型
 page_num = int(page_num)
 except Exception as e:
 # 当输入的页码不是正经数字的时候 默认返回第一页的数据
 page_num = 1
 
 # 数据库总数据是多少条
 total_count = models.Book.objects.all().count()
 
 # 每一页显示多少条数据
 per_page = 10
 
 # 总共需要多少页码来展示
 total_page, m = divmod(total_count, per_page)
 if m:
 total_page += 1
 
 # 如果输入的页码数超过了最大的页码数,默认返回最后一页
 if page_num > total_page:
 page_num = total_page
 
 # 定义两个变量从哪里开始到哪里结束
 data_start = (page_num - 1) * 10
 data_end = page_num * 10
 
 # 页面上总共展示多少页码
 max_page = 11
 if total_page < max_page:
 max_page = total_page
 
 # 把从URL中获取的page_num 当做是显示页面的中间值, 那么展示的便是当前page_num 的前五页和后后五页
 half_max_page = max_page // 2
 # 根据展示的总页码算出页面上展示的页码从哪儿开始
 page_start = page_num - half_max_page
 # 根据展示的总页码算出页面上展示的页码到哪儿结束
 page_end = page_num + half_max_page
 
 # 如果当前页减一半 比1还小, 不然页面上会显示负数的页码
 if page_start <= 1:
 page_start = 1
 page_end = max_page
 # 如果 当前页 加 一半 比总页码数还大, 不然页面上会显示比总页码还大的多余页码
 if page_end >= total_page:
 page_end = total_page
 page_start = total_page - max_page + 1
 
 # 从数据库取值, 并按照起始数据到结束数据展示
 all_book = models.Book.objects.all()[data_start:data_end]
 
 
 # 自己拼接分页的HTML代码
 html_str_list = []
 
 # # 加上首页
 html_str_list.append('<li><a href="/book/?page=1" rel="external nofollow"  >首页</a></li>')
 
 # 断一下 如果是第一页,就没有上一页
 if page_num <= 1:
 html_str_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow"  ><span aria-hidden="true">«</span></a></li>')
 else:
 # 不是第一页,就加一个上一页的标签
 html_str_list.append('<li><a href="/book/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow"   ><span aria-hidden="true">«</span></a></li>'.format(page_num - 1))
 
 for i in range(page_start, page_end + 1):
 # 如果是当前页就加一个active样式类
 if i == page_num:
  tmp = '<li class="active"><a href="/book/?page={0}" rel="external nofollow" rel="external nofollow"  >{0}</a></li>'.format(i)
 else:
  tmp = '<li><a href="/book/?page={0}" rel="external nofollow" rel="external nofollow"  >{0}</a></li>'.format(i)
 
 html_str_list.append(tmp)
 
 # 判断,如果是最后一页,就没有下一页
 if page_num >= total_page:
 html_str_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow"  ><span aria-hidden="true">»</span></a></li>')
 else:
 # 不是最后一页, 就加一个下一页标签
 html_str_list.append('<li><a href="/book/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow"   ><span aria-hidden="true">»</span></a></li>'.format(page_num + 1))
 
 # 加上尾页
 html_str_list.append('<li><a href="/book/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow"   >尾页</a></li>'.format(total_page))
 
 page_html = "".join(html_str_list)
 return render(request, "book.html", {"all_book":all_book, "page_html":page_html})
Python 相关文章推荐
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
Aug 25 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Python中for循环控制语句用法实例
Jun 02 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
Python OpenCV获取视频的方法
Feb 28 Python
python实现读Excel写入.txt的方法
Apr 29 Python
django DRF图片路径问题的解决方法
Sep 10 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
Python数据存储之 h5py详解
Dec 26 Python
Python - 10行代码集2000张美女图
May 23 Python
微信小程序python用户认证的实现
Jul 29 #Python
Python 堆叠柱状图绘制方法
Jul 29 #Python
Django处理Ajax发送的Get请求代码详解
Jul 29 #Python
Django框架视图函数设计示例
Jul 29 #Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 #Python
Python 硬币兑换问题
Jul 29 #Python
django中使用Celery 布式任务队列过程详解
Jul 29 #Python
You might like
php顺序查找和二分查找示例
2014/03/27 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
PHP加密解密实例分析
2015/12/25 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
物流管理毕业生自荐信
2013/10/24 职场文书
主题酒店策划书
2014/01/28 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL