django 百度分页算法

效果如下:

脚本:

  1. 脚本结构

    

  

2.pagination.py
from django.utils.safestring import mark_safe


class Page:
    '''
    current_page: 当前页码
    data_count: 数据总个数
    per_page_count: 每页展示几个数据
    pager_num: 展示页码个数
    '''
    def __init__(self, current_page, data_count, per_page_count=5, pager_num=6):
        self.current_page = current_page
        self.data_count = data_count
        self.per_page_count = per_page_count
        self.pager_num = pager_num

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_count

    @property
    def end(self):
        return self.current_page * self.per_page_count

    @property
    def total_count(self):
        v, y = divmod(self.data_count, self.per_page_count)
        if y:
            v += 1
        return v

    def page_str(self, base_url):
        page_list = []

        first = '<li><a class="page" href="%sp=%s">首页</a></li>' % (base_url, 1,)
        page_list.append(first)

        if self.total_count < self.pager_num:
            start_index = 1
            end_index = self.total_count + 1
        else:
            if self.current_page <= (self.pager_num + 1) / 2:
                start_index = 1
                end_index = self.pager_num + 1
            else:
                start_index = self.current_page - (self.pager_num - 1) / 2
                end_index = self.current_page + (self.pager_num + 1) / 2
                if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
                    end_index = self.total_count + 1
                    start_index = self.total_count - self.pager_num + 1

        if self.current_page == 1:
            prev = '<li><a class="page" href="javascript:void(0);" style="display: none">上一页</a></li>'
        else:
            prev = '<li><a class="page" href="%sp=%s">上一页</a></li>' % (base_url, self.current_page - 1,)
        page_list.append(prev)

        for i in range(int(start_index), int(end_index)):
            if i == self.current_page:
                temp = '<li class="active"><a class="page " href="%sp=%s">%s</a></li>' % (base_url, i, i)
            else:
                temp = '<li ><a class="page" href="%sp=%s">%s</a></li>' % (base_url, i, i)
            page_list.append(temp)

        if self.current_page == self.total_count:
            nex = '<li><a class="page" href="javascript:void(0);" style="display: none">下一页</a></li>'
        else:
            nex = '<li><a class="page" href="%sp=%s">下一页</a></li>' % (base_url, self.current_page + 1,)
        page_list.append(nex)

        last = '<li><a class="page" href="%sp=%s">尾页</a></li>' % (base_url, self.total_count,)
        page_list.append(last)


        total_record = '<span style="display: inline-block;margin-top: 10px;">共%s条记录,共%s页,每页%s条,第%s页</span>' % (self.data_count, self.total_count, self.per_page_count,self.current_page)
        page_list.append(total_record)
        page_str = mark_safe("".join(page_list))



        return page_str
View Code

    

3. view.py
def page(req):
    shop_list = ['apple','apple2','apple3','apple4','apple5','apple6','apple7','apple8','apple9']
    current_page = req.GET.get('p', 1)
    current_page = int(current_page)
    page_obj = pagination.Page(current_page, len(shop_list), 2, 4)

    data = shop_list[page_obj.start:page_obj.end]
    print("data:%s"%data) # data:['apple', 'apple2']

    page_str = page_obj.page_str('/mytest/page/?')
    context = {'page_str':page_str,'data':data}
    return render(req,'page.html',context)
View Code
4.html.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>分页</title>
    <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <style>
        ul li{float:left;}
    </style>
</head>
<body>
<ul>
    {% for i in data %}
    <li>{{i}}</li>
    {% endfor %}
</ul>
<div style="margin-left: 270px" >
<ul class="pagination">
    {{page_str}}
</ul>
</div>


</body>
</html>
View Code
5.url.py
1 from django.conf.urls import url
2 from mytest import views
3 
4 urlpatterns = [
5     # page
6     url(r'page/$', views.page),
7 ]





猜你喜欢

转载自www.cnblogs.com/zhang-dan/p/11312266.html