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数组的处理代码
Jan 04 Python
python 连接sqlite及简单操作
Jun 30 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
python使用tkinter实现简单计算器
Jan 30 Python
python实现简单淘宝秒杀功能
May 03 Python
python中文编码与json中文输出问题详解
Aug 24 Python
我就是这样学习Python中的列表
Jun 02 Python
详解Python中的测试工具
Jun 09 Python
python3.8下载及安装步骤详解
Jan 15 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
Django 如何实现文件上传下载
Apr 08 Python
Python实战之实现简易的学生选课系统
May 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的password_hash()使用实例
2014/03/17 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
让Python代码更快运行的5种方法
2015/06/21 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
Python bytes string相互转换过程解析
2020/03/05 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Python与C/C++的相互调用案例
2021/03/04 Python
悦木之源美国官网:Origins美国
2016/08/01 全球购物
美国电视购物:QVC
2017/02/06 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
用友笔试题目
2016/10/25 面试题
大学生职业生涯规划方案
2014/01/03 职场文书
房地产开盘策划方案
2014/02/10 职场文书
四年大学自我鉴定
2014/02/17 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
球队口号
2014/06/18 职场文书
机电一体化专业求职信
2014/07/22 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python