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下自己编写web框架的一些要点
Apr 29 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
Win8下python3.5.1安装教程
Jul 29 Python
使用python进行拆分大文件的方法
Dec 10 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
解决python flask中config配置管理的问题
Jul 26 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
Python 如何实现数据库表结构同步
Sep 29 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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学习之PHP变量
2006/10/09 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python如何脚本过滤文件中的注释
2020/05/27 Python
python利用opencv保存、播放视频
2020/11/02 Python
出国考察邀请函
2014/01/21 职场文书
请假条格式范文
2014/04/10 职场文书
企业安全生产责任书
2014/04/14 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
工作收入证明模板
2015/06/12 职场文书
篮球拉拉队口号
2015/12/25 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
AJAX学习笔记
2021/05/18 Javascript
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android