Django 自定义分页

在使用django的时候我们往往使用的是django自带的翻页,但是有时这个翻页却无法很好的实现中间页数的自定义

这里写图片描述

这里的页数在django原生的翻页中是无法自定义的,而是将所有的页数都显示出来。

这里是views.py中逻辑部分

import sys
reload(sys)        #这里之前是在python3上的代码,但是在python2上需要加上这个使用utf-8
sys.setdefaultencoding('utf8')             #Python的str默认是ascii编码,和unicode编码冲突,
from django.shortcuts import render,HttpResponse     #就会报这个 标题错误
from app01 import models
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

def users2(request):      #定义一个函数返回
    all_count = models.UserInfo.objects.all().count()   #获取models总共多少账户
    page_info = PageInfo(request.GET.get('p'),10,all_count,request.path_info)
    # 获取get方法传递的页数,分页页数设定,以及url通过request.path_info获取
    user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]
    #user_list 是用来便利数据的
    return render(request,'users2.html',{'user_list':user_list,'page_info': page_info})


class PageInfo(object):
    def __init__(self,current_page,per_page_num,all_count,base_url,page_range=11):
        """
        :param current_page:  当前页
        :param per_page_num:  每页显示数据条数
        :param all_count:  数据库总个数
        :param base_url:  页码标签的前缀
        :param page_range:  页面最多显示的页码个数
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = int(1)           #如果出错就返回第一页
        self.current_page = current_page
        self.per_page_num = per_page_num
        self.all_count = all_count
        a,b = divmod(all_count,per_page_num)
        if b != 0:
            self.all_page = a + 1
        else:
            self.all_page = a
        self.base_url = base_url
        self.page_range = page_range

    def start(self):
        return (self.current_page - 1) * self.per_page_num   #启始页

    def end(self):
        return self.current_page * self.per_page_num        #尾页

    def page_str(self):
        """
        在HTML页面中显示页码信息
        :return:
        """
        page_list = []


        if self.current_page <= 1:        #如果小于1页就不跳转
            prev = '<li><a href="#">上一页</a></li>'
        else:
            prev = '<li><a href="%s?p=%s">上一页</a></li>' %(self.base_url,self.current_page-1,)
        page_list.append(prev)
        # 只有 8页   
        if self.all_page <= self.page_range:      如果所有页小于要分的页数则按总页数来
            start = 1
            end = self.all_page + 1
        else:
            # 页数 18
            if self.current_page > int(self.page_range/2):
                # 当前页: 6,7,8,,9,100
                if (self.current_page + int(self.page_range/2)) > self.all_page:
                    start = self.all_page - self.page_range + 1
                    end = self.all_page + 1
                else:
                    start = self.current_page - int(self.page_range/2)
                    end = self.current_page + int(self.page_range/2) + 1
            else:
                # 当前页: 1,2,3,4,5,
                start = 1
                end = self.page_range + 1
        for i in range(start,end):
            if self.current_page == i:
                temp = '<li class="active"><a href="%s?p=%s">%s</a></li>' %(self.base_url,i,i,)
            else:
                temp = '<li><a href="%s?p=%s">%s</a></li>' % (self.base_url, i, i,)
            page_list.append(temp)
        print "1"
        if self.current_page >= self.all_page:
            nex = '<li><a href="#">下一页</a></li>'
        else:
            nex = '<li><a href="%s?p=%s">下一页</a></li>' % (self.base_url,self.current_page + 1,)
        page_list.append(nex)
        print page_list,"list"
        print "list"

        return "".join(page_list)

这里是html的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css" />
</head>
<body>
    <div style="width: 700px;margin: 0 auto;">
        <h1>用户列表</h1>
        <table class="table table-hover table-bordered">
            <thead>
                <tr>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>邮箱</th>
                </tr>
            </thead>
            <tbody>
                {% for row in user_list %}
                    <tr>
                        <td>{{ row.username }}</td>
                        <td>{{ row.password }}</td>
                        <td>{{ row.email }}</td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
    <div>
        <nav aria-label="...">
          <ul class="pager">
              {{ page_info.page_str|safe }}

          </ul>
        </nav>


    </div>
</body>
</html>
代码注释后面加上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值