################## 分页 #######################
分页, 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 %}
################## 分页 #######################
################## 分页 #######################