Python Django 添加首页尾页上一页下一页代码实例


Posted in Python onAugust 21, 2019

添加首页和尾页:

views.py:

from django.shortcuts import render
from app01 import models
def book_list(request):
  # 从 URL 中取参数
  page_num = request.GET.get("page")
  print(page_num, type(page_num))
  page_num = int(page_num) 
  # 定义两个变量保存数据从哪儿取到哪儿
  data_start = (page_num - 1) * 10
  data_end = page_num * 10 
  # 书籍总数
  total_count = models.Book.objects.all().count() 
  # 每一页显示多少条数据
  per_page = 10
  # 总共需要多少页码来显示
  total_page, m = divmod(total_count, per_page) 
  # 页面上最多展示的页码
  max_page = 11
  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 
  # 如果还有数据
  if m:
    total_page += 1 
  all_book = models.Book.objects.all()[data_start:data_end] 
  # 拼接 html 的分页代码
  html_list = [] 
  # 添加首页按钮
  html_list.append('<li><a href="/books/?page=1" rel="external nofollow" >首页</a></li>')
  # 展示的页码
  for i in range(page_start, page_end + 1):
    tmp = '<li><a href="/book_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    html_list.append(tmp) 
  # 添加尾页按钮
  html_list.append('<li><a href="/books/?page={}" rel="external nofollow" >尾页</a></li>'.format(total_page)) 
  page_html = "".join(html_list) # 拼接 html 的分页代码 
  return render(request, "book_list.html", {"books": all_book, "page_html": page_html})

book_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>书籍列表</title>
  <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css" rel="external nofollow" rel="external nofollow" >
</head>
<body> 
<div class="container"> 
  <table class="table table-bordered">
    <thead>
    <tr>
      <th>序号</th>
      <th>id</th>
      <th>书名</th>
    </tr>
    </thead>
    <tbody>
    {% for book in books %}
      <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ book.id }}</td>
        <td>{{ book.title }}</td>
      </tr>
    {% endfor %}
    </tbody>
  </table> 
  <nav aria-label="Page navigation">
    <ul class="pagination">
      <li>
        {{ page_html|safe }}
      </li>
    </ul>
  </nav>
</div> 
</body>
</html>

运行结果:

Python Django 添加首页尾页上一页下一页代码实例

添加上一页、下一页:

views.py:

from django.shortcuts import render
from app01 import models 
def book_list(request):
  # 从 URL 中取参数
  page_num = request.GET.get("page")
  print(page_num, type(page_num))
  page_num = int(page_num) 
  # 定义两个变量保存数据从哪儿取到哪儿
  data_start = (page_num - 1) * 10
  data_end = page_num * 10 
  # 书籍总数
  total_count = models.Book.objects.all().count() 
  # 每一页显示多少条数据
  per_page = 10 
  # 总共需要多少页码来显示
  total_page, m = divmod(total_count, per_page) 
  # 页面上最多展示的页码
  max_page = 11
  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 
  # 如果还有数据
  if m:
    total_page += 1 
  all_book = models.Book.objects.all()[data_start:data_end] 
  # 拼接 html 的分页代码
  html_list = [] 
  # 添加首页按钮
  html_list.append('<li><a href="/book_list/?page=1" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</a></li>') 
  # 如果是第一页,就没有上一页
  if page_num <= 1:
    html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>'.format(page_num-1))
  else:
    # 加一个上一页的标签
    html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" 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_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    else:
      tmp = '<li><a href="/book_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    html_list.append(tmp) 
  # 如果是最后一页,就没有下一页
  if page_num >= total_page:
    html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>')
  else:
    html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>'.format(page_num+1)) 
  # 添加尾页按钮
  html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page))
 
  page_html = "".join(html_list) # 拼接 html 的分页代码
  return render(request, "book_list.html", {"books": all_book, "page_html": page_html})

book_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>书籍列表</title>
  <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css" rel="external nofollow" rel="external nofollow" >
</head>
<body> 
<div class="container"> 
  <table class="table table-bordered">
    <thead>
    <tr>
      <th>序号</th>
      <th>id</th>
      <th>书名</th>
    </tr>
    </thead>
    <tbody>
    {% for book in books %}
      <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ book.id }}</td>
        <td>{{ book.title }}</td>
      </tr>
    {% endfor %} 
    </tbody>
  </table>
  <nav aria-label="Page navigation">
    <ul class="pagination">
      <li>
        {{ page_html|safe }}
      </li>
    </ul>
  </nav> 
</div>
</body>
</html>

运行结果:

Python Django 添加首页尾页上一页下一页代码实例

后续改进:

处理用户传给 url 的 page 参数异常的值的情况

例如:

访问,http://127.0.0.1:8888/book_list/?page=a

访问,http://127.0.0.1:8888/book_list/?page=-1

都会出错

改进:

from django.shortcuts import render
from app01 import models
def book_list(request):
  # 从 URL 中取参数
  page_num = request.GET.get("page")
  print(page_num, type(page_num)) # page_num 为 str 类型
  # 书籍总数
  total_count = models.Book.objects.all().count() 
  # 每一页显示多少条数据
  per_page = 10 
  # 总共需要多少页码来显示
  total_page, m = divmod(total_count, per_page) 
  # 如果还有数据
  if m:
    total_page += 1
  try:
    page_num = int(page_num)
    # 如果输入的页码数超过了最大的页码数,默认返回最后一页
    if page_num > total_page:
      page_num = total_page
    # 如果输入的页码数小于 1,则返回第一页
    if page_num < 1:
      page_num = 1
  except Exception as e:
    # 当输入的页码不是正经数字的时候 默认返回第一页的数据
    page_num = 1
  # 定义两个变量保存数据从哪儿取到哪儿
  data_start = (page_num - 1) * 10
  data_end = page_num * 10 
  # 页面上最多展示的页码
  max_page = 11
  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_list = [] 
  # 添加首页按钮
  html_list.append('<li><a href="/book_list/?page=1" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</a></li>') 
  # 如果是第一页,就没有上一页
  if page_num <= 1:
    html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>'.format(page_num-1))
  else:
    # 加一个上一页的标签
    html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" 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_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    else:
      tmp = '<li><a href="/book_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    html_list.append(tmp) 
  # 如果是最后一页,就没有下一页
  if page_num >= total_page:
    html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>')
  else:
    html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>'.format(page_num+1)) 
  # 添加尾页按钮
  html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page))
 
  page_html = "".join(html_list) # 拼接 html 的分页代码
  return render(request, "book_list.html", {"books": all_book, "page_html": page_html})

如果数据库中的数据数少于 max_page,则会显示负数的页数

例如数据库中只有 21 条数据:

Python Django 添加首页尾页上一页下一页代码实例

改进:

from django.shortcuts import render
from app01 import models
def book_list(request):
  # 从 URL 中取参数
  page_num = request.GET.get("page")
  print(page_num, type(page_num)) # page_num 为 str 类型 
  # 书籍总数
  total_count = models.Book.objects.all().count() 
  # 每一页显示多少条数据
  per_page = 10 
  # 总共需要多少页码来显示
  total_page, m = divmod(total_count, per_page) 
  # 如果还有数据
  if m:
    total_page += 1
  try:
    page_num = int(page_num)
    # 如果输入的页码数超过了最大的页码数,默认返回最后一页
    if page_num > total_page:
      page_num = total_page
    # 如果输入的页码数小于 1,则返回第一页
    if page_num < 1:
      page_num = 1
  except Exception as e:
    # 当输入的页码不是正经数字的时候 默认返回第一页的数据
    page_num = 1 
  # 定义两个变量保存数据从哪儿取到哪儿
  data_start = (page_num - 1) * 10
  data_end = page_num * 10 
  # 页面上最多展示的页码
  max_page = 11
  # 如果总页码数小于页面上最多展示的页码
  if total_page < max_page:
    max_page = total_page
  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_list = [] 
  # 添加首页按钮
  html_list.append('<li><a href="/book_list/?page=1" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</a></li>') 
  # 如果是第一页,就没有上一页
  if page_num <= 1:
    html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>'.format(page_num-1))
  else:
    # 加一个上一页的标签
    html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" 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_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    else:
      tmp = '<li><a href="/book_list/?page={0}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    html_list.append(tmp) 
  # 如果是最后一页,就没有下一页
  if page_num >= total_page:
    html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>')
  else:
    html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>'.format(page_num+1)) 
  # 添加尾页按钮
  html_list.append('<li><a href="/book_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page)) 
  page_html = "".join(html_list) # 拼接 html 的分页代码
  return render(request, "book_list.html", {"books": all_book, "page_html": page_html})

运行结果:

Python Django 添加首页尾页上一页下一页代码实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的引用和拷贝浅析
Nov 22 Python
Python制作刷网页流量工具
Apr 23 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
对python中执行DOS命令的3种方法总结
May 12 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
利用python循环创建多个文件的方法
Oct 25 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
为什么说python适合写爬虫
Jun 11 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
python requests库的使用
Jan 06 Python
写好Python代码的几条重要技巧
May 21 Python
Python Django 简单分页的实现代码解析
Aug 21 #Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 #Python
python爬虫豆瓣网的模拟登录实现
Aug 21 #Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 #Python
详解Python利用random生成一个列表内的随机数
Aug 21 #Python
Python Django 封装分页成通用的模块详解
Aug 21 #Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 #Python
You might like
用文本文件制作留言板提示(下)
2006/10/09 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
PHP函数超时处理方法
2016/02/14 PHP
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
简单的Python的curses库使用教程
2015/04/11 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
项目开发计划书
2014/01/09 职场文书
会务接待方案
2014/02/27 职场文书
股权收购意向书
2014/04/01 职场文书
专项法律服务方案
2014/06/11 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
客房领班岗位职责
2015/02/11 职场文书
无罪辩护词范文
2015/05/21 职场文书
作文之亲情600字
2019/09/23 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB