Django之自定义分页实现

目录结构

 

class PageSet:
    def __init__(self,current_page,all_pages,base_url,show_data_counts,dispaly_pages=11):
        '''
        :param current_page: 当前页码
        :param all_pages: 总页码
        :param show_data_counts: 每页显示数据条数
        :param base_url: url地址
        :param dispaly_pages: 页码显示数量
        '''
        #当前页码数据类型判断及转换为int数据类型
        try:
            self.current_page = int(current_page)
        except Exception:
            self.current_page = 1
        #计算总页码数
        a,b = divmod(all_pages, show_data_counts)
        if b:
            a += 1
        self.all_pages = a
        self.base_url = base_url
        self.show_data_counts = show_data_counts
        self.dispaly_pages = dispaly_pages

    def start_datas(self):
        '''计算当前页起始显示数据'''
        return (self.current_page-1) * self.show_data_counts

    def end_datas(self):
        '''计算当前页结束显示数据'''
        return self.current_page * self.show_data_counts

    def show_pages(self):
        '''页面显示逻辑'''
        #获取页码显示半数
        dispaly_half_pages = int((self.dispaly_pages-1)/2)
        # 如果总页数小于show_page,显示从第一页开始,总页数结尾
        if self.all_pages <= self.dispaly_pages:
            begin_page = 1
            stop_page = self.all_pages + 1
        else:
            # 如果当前页码小于等于页码显示半数,显示从第一页开始,显示页数结尾
            if self.current_page <= dispaly_half_pages:
                begin_page = 1
                stop_page = self.dispaly_pages + 1
            # 如果当前页码小于等于页码显示半数,显示从第一页开始,显示页数结尾
            elif self.current_page >= self.all_pages - dispaly_half_pages:
                begin_page = self.all_pages - 10
                stop_page =self.all_pages + 1
            # 显示从当前页减去显示页码半数开始,当前页加上页码显示半数结束
            else:
                begin_page = self.current_page - dispaly_half_pages
                stop_page =self.current_page + dispaly_half_pages + 1
        #初始化页码HTML字符串列表
        page_list = []
        #首页
        first_page = "<li><a href ='%s/?c_page=%s'>首页</a></li>" % (self.base_url,1)
        page_list.append(first_page)
        # 上一页
        if self.current_page == 1:
            prev_page = "<li><a href ='#'>上一页</a></li>"
        else:
            prev_page = "<li><a href ='%s/?c_page=%s'>上一页</a></li>" % (self.base_url,self.current_page-1)
        page_list.append(prev_page)
        #数字页面显示
        for i in range(begin_page,stop_page):
            if self.current_page == i:
                temp = "<li class='active'><a href ='%s/?c_page=%s'> %s </a></li>" %(self.base_url,i,i)
            else:
                temp = "<li><a href ='%s/?c_page=%s'> %s </a></li>" % (self.base_url,i, i)
            page_list.append(temp)
        # 下一页
        if self.current_page >= self.all_pages:
            next_page = "<li><a href ='#'>下一页</a></li>"
        else:
            next_page = "<li><a href ='%s/?c_page=%s'>下一页</a></li>" % (self.base_url,self.current_page+1)
        page_list.append(next_page)
        # 末页
        over_page = "<li><a href ='%s/?c_page=%s'>末页</a></li>" % (self.base_url, self.all_pages)
        page_list.append(over_page)
        return ''.join(page_list)             #转换为字符串返回
page_set.py

 

from django.shortcuts import render
from app01 import models
from utils.page_set import PageSet

def custom(request):
    current_page = request.GET.get('c_page')
    all_pages = models.UserInfo.objects.all().count()
    page_set = PageSet(current_page,all_pages,'/custom.html',10)
    display_list = models.UserInfo.objects.all()[page_set.start_datas():page_set.end_datas()]
    return render(request,'custom.html',{'dispaly_list':display_list,'page_set':page_set})
views.py

 

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^custom.html/$', views.custom),
]
urls.py

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
    {% for row in dispaly_list %}
        <p>{{ row.username }}</p>
    {% endfor %}

    <nav aria-label="Page navigation">
      <ul class="pagination">
        {{ page_set.show_pages|safe }}
      </ul>
    </nav>
</body>
</html>
custom.html

 

posted @ 2018-10-17 17:47  Joe1991  阅读(105)  评论(0)    收藏  举报