##################   分页    #######################

分页,
django有自己内置的分页,但是功能不是很强大,所以自己写一个分页,
web页面数据非常多的时候,是必须要有分页的,
分页思路:通过url后面加参数的形式,
http://127.0.0.1:8000/book_list/?page=1 页面 展示数据 切片
第一页,1-10 [0-10] #因为切片下标不包含,
第二页,11-20 [10-20]
第三页,21-30 [20-30]
...
第n页, [(n-1)*10:n*10]
all_book = models.Book.objects.all()[data_start:date_end]

##################   分页--视图函数    ######################

def book_list(request):

    page_num=request.GET.get("page")
total_count=models.Book.objects.count()
from utils.mypage import Page
page_obj=Page(page_num,total_count,per_page=10,url_prefix="/book_list/",max_page=11)
ret = models.Book.objects.all()[page_obj.start:page_obj.end]
page_html=page_obj.page_html()
return render(request,"book_list2.html",{'all_book': ret, 'page_html': page_html}) # # 获取页码
# page_num = request.GET.get('page')
# print(page_num, type(page_num)) # 这个page_num是字符串类型,需要转一下,
# # 一页显示多少数据
# per_page = 10
# # 总数据多少
# total_count = models.Book.objects.count()
# # 总共需要多少页码来显示
# total_page, m = divmod(total_count, per_page) # divmod(第一个数,第二个数) 得到一个元组,第一个是整除的商,第二个是整除的余数,
# if m:
# total_page += 1
# try:
# page_num = int(page_num)
# # if page_num>total_page:
# # page_num=total_page
# except Exception as e: # 如果不错这个处理,就会导致报错,
# # 输入的页面不是正经的数字的时候返回第一页,
# page_num = 1
# if page_num > total_page:
# page_num=total_page
#
# # 数据开始
# data_start = (page_num - 1) * 10
# # 数据结束
# date_end = page_num * 10
# print(data_start, date_end)
#
# ##########################################################################
# # 页面展示页码的计算
#
# # 页面上总共展示多少页码
# # 如果总页码比最大展示页码小,就让总页码最为最大页码
# max_page = 11
# if total_page < max_page:
# max_page = total_page
#
# half_max_page = max_page // 2
# # 页码从哪开始
# # 比如第6页,就是开始页是6-5,从第1页开始
# page_start = page_num - half_max_page
# # 页码从哪结束
# # 比如第6页,就是开始页是6+5,从第11页结束
# page_end = page_num + half_max_page
# # 如果当前页减一半比1还小,就有问题了,
# # 就把第一页作为开始,把最大的页码数作为最后一页
# if page_start <= 1:
# page_start = 1
# page_end = max_page
# # 如果结尾比总页码还大,就有问题了,
# # 就把总页码最为最后一页,把总页码减最大展示页面+1,最为最后一页,
# if page_end >= total_page:
# page_end = total_page
# page_start = total_page - max_page + 1
#
# #############################################################################
# # 自己拼接分页的html
# html_str_list = []
# # 加第一页
# html_str_list.append('<li><a href="/book_list/?page=1">首页</a></li>')
# # 加上一页:
# if page_num <= 1:
# html_str_list.append('<li class="disabled"> <a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
# else:
# html_str_list.append(
# '<li> <a href="/book_list/?page={}"><span aria-hidden="true">&laquo;</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}">{0}</a></li>'.format(i)
# else:
# tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
#
# html_str_list.append(tmp)
#
# # 加下一页
# # 判断如果是最后一页就没有下一页
# if page_num >= total_page:
# html_str_list.append('<li class="disabled"> <a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
# else:
# html_str_list.append(
# '<li> <a href="/book_list/?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(page_num + 1))
#
# # 最后一页
# html_str_list.append('<li><a href="/book_list/?page={0}">尾页</a></li>'.format(total_page))
# # 把列表中的html数据拼接
# page_html = ''.join(html_str_list)
#
# #########################################################################
# # 取出所有的书内容
# all_book = models.Book.objects.all()[data_start:date_end] # 切片取前10个
# # 在html中渲染数据,就是字符串的替换
# return render(request, 'book_list2.html', {'all_book': all_book, 'page_html': page_html})

##################   分页--封装    ########################

class Page():

    def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
"""
输入三个引号回车,就有这些参数了
:param page_num: 当前页码数
:param total_count: 数据总数
:param url_prefix: a标签href的前缀
:param per_page: 每页显示多少条数据
:param max_page: 页面上最多显示几个页码
"""
self.url_prefix = url_prefix
self.max_page = max_page
# 每一页显示多少条数据
# 总共需要多少页码来展示
total_page, m = divmod(total_count, per_page)
if m:
total_page += 1
self.total_page = total_page try:
page_num = int(page_num)
# 如果输入的页码数超过了最大的页码数,默认返回最后一页
if page_num > total_page:
page_num = total_page
except Exception as e:
# 当输入的页码不是正经数字的时候 默认返回第一页的数据
page_num = 1
self.page_num = page_num # 定义两个变量保存数据从哪儿取到哪儿
self.data_start = (page_num - 1) * 10
self.data_end = page_num * 10 # 页面上总共展示多少页码
if total_page < self.max_page:
self.max_page = total_page half_max_page = self.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 = self.max_page
# 如果 当前页 加 一半 比总页码数还大
if page_end >= total_page:
page_end = total_page
page_start = total_page - self.max_page + 1
self.page_start = page_start
self.page_end = page_end @property
def start(self):
return self.data_start @property
def end(self):
return self.data_end def page_html(self):
# 自己拼接分页的HTML代码
html_str_list = []
# 加上第一页
html_str_list.append('<li><a href="{}?page=1">首页</a></li>'.format( self.url_prefix)) # 判断一下 如果是第一页,就没有上一页
if self.page_num <= 1:
html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'.format(self.page_num-1))
else:
# 加一个上一页的标签
html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format( self.url_prefix, self.page_num-1)) for i in range(self.page_start, self.page_end+1):
# 如果是当前页就加一个active样式类
if i == self.page_num:
tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
else:
tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format( self.url_prefix, i) html_str_list.append(tmp) # 加一个下一页的按钮
# 判断,如果是最后一页,就没有下一页
if self.page_num >= self.total_page:
html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
else:
html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format( self.url_prefix, self.page_num+1))
# 加最后一页
html_str_list.append('<li><a href="{}?page={}">尾页</a></li>'.format( self.url_prefix, self.total_page)) page_html = "".join(html_str_list)
return page_html

##################   分页--页面html    #######################

{#继承母版#}
{% extends 'base.html' %} {#把自己页面的内容,放入母版相应的位置,#}
{% block page-main %}
<h1 class="page-header">书籍管理页面</h1> <div class="panel panel-primary">
<!-- Default panel contents -->
<div class="panel-heading">出版社列表 <i class="fa fa-thumb-tack pull-right"></i></div>
<div class="panel-body">
<div class="row" style="margin-bottom: 15px">
<div class="col-md-4">
<div class="input-group">
<input type="text" class="form-control" placeholder="Search for...">
<span class="input-group-btn">
<button class="btn btn-default" type="button">搜索</button>
</span>
</div><!-- /input-group -->
</div><!-- /.col-md-4 -->
<div class="col-md-3 pull-right">
<a href="/add_book/" class="btn btn-success">新页面添加</a>
<button class="btn btn-success" data-toggle="modal" data-target="#myModal">新增</button>
</div> </div><!-- /.row --> <table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>id</th>
<th>书名</th>
<th>出版社</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for i in all_book %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ i.id }}</td>
<td>{{ i.title }}</td>
<td>{{ i.publisher.name }}</td>
{# 这一步很重要,i.publishe是取到的一个对象,i.publishe_id才是一个id#}
<td>
<a class="btn btn-danger" href="/delete_book/?id={{ i.id }}">删除</a>
<a class="btn btn-info" href="/edit_book/?id={{ i.id }}">编辑</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="5" class="text-center">暂时没有数据哦~~~~~</td>
</tr> {% endfor %}
</tbody>
</table> {# 分页开始 #}
<nav aria-label="Page navigation" class="text-right">
<ul class="pagination">
{{ page_html|safe }}
</ul>
</nav>
{# 分页结束 #} </div> </div>
{% endblock %}

##################   分页    #######################

##################   分页    #######################

django框架进阶-分页-长期维护的更多相关文章

  1. django框架进阶-中间件-长期维护

    ##################    为什么使用中间件?      ####################### 先说几个需求, 1,url的白名单,url=[ "XX"] ...

  2. django框架进阶-AJAX-长期维护

    ##################   预备知识---json     ####################### 预备知识,json 什么是json?这是一种数据格式,和语言没有关系, 为什么 ...

  3. django框架进阶-admin-长期维护

    ###############    django--admin的使用    ################ # django后台管理: # 第一步: # 在settings文件中修改语言和时区 L ...

  4. django框架进阶-auth认证系统-长期维护

    ##################    django的认证系统     ####################### 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要 ...

  5. django框架进阶-使用缓存-长期维护

    ###############   django-缓存页面    ############### ########################################### # 全站缓存, ...

  6. django框架进阶-ModelForm组件-长期维护

    ############################################################ """ 通常在Django项目中,我们编写的大部 ...

  7. django框架进阶-form组件-长期维护

    ##################     form组件做了什么事情?      ####################### 之前web开发的模式,以注册为例 1,要有一个注册页面,然后有一个f ...

  8. django框架进阶-cookie和session-长期维护

    ###############    python基础回顾:装饰器    ################ # 装饰器非常重要,1是写代码的时候,2是面试的时候,没有python开发不问装饰器的, # ...

  9. Django框架进阶

    Django ORM那些相关操作 Django中ORM介绍和字段及字段参数 Cookie.Session和自定义分页 Django 中间件 AJAX Django form表单 Django的认证系统 ...

随机推荐

  1. VUE.js入门学习(2)-基础精讲

    1.VUE 实例 - 一个项目是有很多的vue实例拼装的.每一个组建就是vue的实例. var vm = new Vue() 2.VUE 实例生命周期钩子 生命周期函数:VUE实例在某一个时间点会自动 ...

  2. 图像算法五:【图像小波变换】多分辨率重构、Gabor滤波器、Haar小波

    原 https://blog.csdn.net/alwaystry/article/details/52756051 图像算法五:[图像小波变换]多分辨率重构.Gabor滤波器.Haar小波 2018 ...

  3. python:批量修改文件名批量修改图片尺寸

    批量修改文件名  参考博客:https://www.cnblogs.com/zf-blog/p/7880126.html 功能:批量修改文件名 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  4. pytorch学习问题汇总

    问题六: 问题五:这里是怎么得到的? 问题四:为什么会是如下结果? torch.bernoulli(a)怎么是这个结果? 问题1:torch各个类型数据格式如何转换?数据类型在官方文档torch.Te ...

  5. 基础nginx配置文件

    nginx的配置文件很长,如果开始就看全部的话会懵逼,以下以最简单的配置文件来学习. 目标:定义一个虚拟主机127.0.0.1   端口是8080 [root@localhost conf]# cat ...

  6. 干货 | 基于Go SDK操作京东云对象存储OSS的入门指南

    前言 本文介绍如何使用Go语言对京东云对象存储OSS进行基本的操作,帮助客户快速通过Go SDK接入京东云对象存储,提高应用开发的效率. 在实际操作之前,我们先看一下京东云OSS的API接口支持范围和 ...

  7. 洛谷 P2722 总分 Score Inflation && 完全背包模板

    题目传送门 解题思路: 补一个完全背包的模板,跟01背包十分相似,唯一不同在于重量j的枚举顺序. AC代码: #include<cstdio> #include<iostream&g ...

  8. Dojo Grid结合Ajax用法

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomerDefine ...

  9. 熟练使用WebApi开发

    在建立WebApi框架的时候,要想自己的业务需求是什么.例如PC端(前端),APP端都要使用的同一接口,就得考虑Webapi来提供接口支持了.最近公司刚好让我整合一下公司的接口项目(有WebServi ...

  10. 吴裕雄--天生自然 PYTHON3开发学习:列表

    list1 = ['Google', 'Runoob', 1997, 2000]; list2 = [1, 2, 3, 4, 5 ]; list3 = ["a", "b& ...