Django 自定义分页

Django 自定义分页

定一个一个类

# 说明 
#1.通过传入对应的参数,自动生成html标签代码 ,并返回,前段只需接收并渲染显示即可
#2.请注意标签内的网址接口,如更改,请修改对应的值


class PageInfo:
    def __init__(self, cur_page, total, per_page=10, show_page=11):
        self.cur_page = cur_page
        self.per_page = per_page
        self.total = total
        self.show_page = show_page

        a, b = divmod(self.total, self.per_page)
        if b:
            a = a + 1
        self.total_page = a  #### 总页数

    #### 获取起始索引
    def get_start(self):
        start = (self.cur_page - 1) * self.per_page
        return start

    #### 获取结束索引
    def get_end(self):
        return self.cur_page * self.per_page

    def get_page(self):

        half = (self.show_page - 1) // 2

        #### taotal_page = 5 < show_page = 11
        if self.total_page < self.show_page:
            begin = 1
            end = self.total_page
        else:
            #### 左边极值判断
            if self.cur_page - half <= 0:
                begin = 1
                # end = self.cur_page + half
                end = self.show_page
            #### 右边极值的判断
            elif self.cur_page + half > self.total_page:
                # begin =  self.cur_page - half
                begin = self.total_page - self.show_page + 1
                end = self.total_page  ### 31
            #### 正常页码判断
            else:
                begin = self.cur_page - half
                end = self.cur_page + half

        page_list = []
        if self.cur_page == 1:
            astr = "<li><a href='#' aria-label='Previous'><span aria-hidden='true'>&laquo;</span></a></li>"
        else:
            astr = "<li><a href='/classes/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>&laquo;</span></a></li>" % (
                    self.cur_page - 1)
        page_list.append(astr)

        for i in range(begin, end + 1):
            if self.cur_page == i:
                # astr = "<a style='display:inline-block; padding:5px;margin:5px;background-color:red;' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
                astr = "<li class='active'><a href='/classes/?cur_page=%s'>%s</a></li>" % (i, i)
            else:
                # astr = "<a style='display:inline-block; padding:5px;margin:5px' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
                astr = "<li><a href='/classes/?cur_page=%s'>%s</a></li>" % (i, i)
            page_list.append(astr)

        if self.cur_page == self.total_page:
            astr = "<li><a href='#' aria-label='Next'><span aria-hidden='true'>&raquo;</span></a></li>"
        else:
            astr = "<li><a href='/classes/?cur_page=%s' aria-label='Next'><span aria-hidden='true'>&raquo;</span></a></li>" % (
                    self.cur_page + 1)
        page_list.append(astr)

        s = " ".join(page_list)

        return s

定义一个函数来实现类的使用



def classes(request):
    if request.method == 'GET':
        cur_page = request.GET.get('cur_page')  #首先获取前端传来的url参数
        if not cur_page:      # 有的是直接传过来一个没有参数的 ,我们默认给他一个第一页
            cur_page = 1

        cur_page = int(cur_page)   #因为传过来的是一个文本类型,要转换成整型
        res = models.Classes.objects.all()  #连接数据库,获取全部信息
        total = models.Classes.objects.count() #连接数据库获取数据库总数量
        page = PageInfo(cur_page, total) #实例化上边的类
        start = page.get_start() #通过类获取起始页
        end = page.get_end() #通过类获取结束页

        user_list = models.Classes.objects.all()[start:end] #连接数据库通过获取指定范围的数据,相当于原生SQL的limit

        return render(request, "classes.html", {'classes': res, "user_list": user_list, "page": page})  #最后将获取的数据一并发给前段
   

前段渲染实现方式

//说明: 使用了bootstrap美化,

    <table border="1px" class="table table-bordered table-hover table-striped">
        <thead>    //标题头
        <tr>
            <th>ID</th>   
            <th>班级名称</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for item in user_list %}  //这里是渲染后端传来的分页后的数据
            <tr>

                <td>{{ item.cid }}</td>
                <td>{{ item.cname }}</td>
                <td>


					//这段代码可以忽略
                    <a href="/del_classes/?cid={{ item.cid }}" class="dele  btn btn-danger">删除</a>
                    <a href="/up_class/?cid={{ item.cid }}" class="btn btn-info">更新</a>
                    <button class="ajax_up btn btn-success">ajax更新</button>
                   
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
	

    <nav aria-label="Page navigation">
      <ul class="pagination">
          {{ page.get_page | safe}}  //这里显示的是分页导航栏,也就是有多少页 分出多少个按钮
      </ul>
    </nav>


posted @ 2019-08-15 16:59  『侠客行』  阅读(361)  评论(0编辑  收藏  举报