django框架进阶-分页-长期维护
################## 分页 #######################
分页,
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">»</span></a></li>')
#     else:
#         html_str_list.append(
#             '<li> <a href="/book_list/?page={}"><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}">{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">»</span></a></li>')
#     else:
#         html_str_list.append(
#             '<li> <a href="/book_list/?page={}"><span aria-hidden="true">»</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">«</span></a></li>'.format(self.page_num-1))
        else:
            # 加一个上一页的标签
            html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">«</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">»</span></a></li>')
        else:
            html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">»</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框架进阶-分页-长期维护的更多相关文章
- django框架进阶-中间件-长期维护
		
################## 为什么使用中间件? ####################### 先说几个需求, 1,url的白名单,url=[ "XX"] ...
 - django框架进阶-AJAX-长期维护
		
################## 预备知识---json ####################### 预备知识,json 什么是json?这是一种数据格式,和语言没有关系, 为什么 ...
 - django框架进阶-admin-长期维护
		
############### django--admin的使用 ################ # django后台管理: # 第一步: # 在settings文件中修改语言和时区 L ...
 - django框架进阶-auth认证系统-长期维护
		
################## django的认证系统 ####################### 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要 ...
 - django框架进阶-使用缓存-长期维护
		
############### django-缓存页面 ############### ########################################### # 全站缓存, ...
 - django框架进阶-ModelForm组件-长期维护
		
############################################################ """ 通常在Django项目中,我们编写的大部 ...
 - django框架进阶-form组件-长期维护
		
################## form组件做了什么事情? ####################### 之前web开发的模式,以注册为例 1,要有一个注册页面,然后有一个f ...
 - django框架进阶-cookie和session-长期维护
		
############### python基础回顾:装饰器 ################ # 装饰器非常重要,1是写代码的时候,2是面试的时候,没有python开发不问装饰器的, # ...
 - Django框架进阶
		
Django ORM那些相关操作 Django中ORM介绍和字段及字段参数 Cookie.Session和自定义分页 Django 中间件 AJAX Django form表单 Django的认证系统 ...
 
随机推荐
- delphi http server
			
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
 - 无车承运前世今生,5G货运管家期待您的加入
			
历时三年的无车承运人试点工作结束,从2020年1月1日起,将执行新的暂行<办法>,在这样一个承前启后的阶段,无车承运人的命运如何?网络货运经营者又是何物? 在新赛道下,将迎来什么样的机遇和 ...
 - B. Odd Sum Segments     CF(分割数组)
			
题目地址 http://codeforces.com/contest/1196/problem/B B. Odd Sum Segments time limit per test 3 seconds ...
 - MyBatis+SpringMVC 框架搭建小结
			
前言:最近再写一款视频播放器的后台,踩了很多坑,在此总结. 设计顺序: 前提:搭建配置完好的Spring-MyBatis项目 1.流程分析,数据库设计(看似无用,真正做起来真的需要这个东西帮忙整理下思 ...
 - python pandas字符串函数详解(转)
			
pandas字符串函数详解(转)——原文连接见文章末尾 在使用pandas框架的DataFrame的过程中,如果需要处理一些字符串的特性,例如判断某列是否包含一些关键字,某列的字符长度是否小于3等等 ...
 - c语言:函数的递归调用
			
c语言可以将代码模块化,这是其很重要的一个特性. 说道代码模块化,我们很自然的就会联想到函数.而函数中,比较难的一个知识点就是函数的递归调用. 值得注意的是,函数的递归调用在现实工作并不是很常用,但是 ...
 - 系统 win 10 专业版 下载地址
			
thunder://QUFodHRwOi8veHoyLjgxMDg0MC5jb20vY25fd2luZG93c18xMF9jb25zdW1lcl9lZGl0aW9uc192ZXJzaW9uXzE4MD ...
 - 静态页面缓存(thymeleaf模板writer)
			
//前端html <!DOCTYPE html><html lang="en"> <head> <meta charset="U ...
 - springCloud 常用组件总结
			
本文浅谈只是对我自己初期认识这spring cloud的一个笔记. 微服务是一种架构风格和一种应对业务的架构策略.实现这种的技术方式很多.本文主要说spring cloud. spring cloud ...
 - day60-mysql-正则表达式
			
.正则表达式: 8.1 ^ 匹配 name 名称 以 "e" 开头的数据 select * from person where name REGEXP '^e'; 8.2 $ 匹配 ...