python---自定义分页类

# coding:utf8
# __author:  Administrator
# date:      2018/3/7 0007
# /usr/bin/env python
import tornado.web
from math import ceil

LIST_INFO =[
    {'username':'ld',"email":'12345@qq.com'},
]

class Pagination:
    #传入当前页,总条数
    def __init__(self,current_page,total_num):
        try:
            current_page = int(current_page)
        except:
            current_page = 1
        if current_page < 1:
            current_page = 1
        #总条数
        self.total_num=total_num
        #默认每页显示内容
        self.page_size=5
        #默认分页栏显示几页
        self.page_show_num=11
        #当前页
        self.current_page=current_page
        #总页数
        self.total_page=ceil(total_num/self.page_size)
        #当前路径
        self.base_url='/index/'

    #设置当前路径
    @property
    def set_base_url(self,base_url):
        self.base_url=base_url

    #设置页面显示条数
    @property
    def set_size(self,page_size):
        self.page_size=page_size

    #设置分页类显示数量
    @property
    def set_page_show_num(self,page_show_num):
        self.page_show_num=page_show_num

    #设置总页数
    @property
    def set_total(self,page_total):
        self.total_page=page_total

    #获取分页栏的页数范围,返回列表
    def get_list(self):
        cur = (self.current_page - 1) * self.page_size
        show_page = []
        mid_page=int(self.page_show_num/2)
        if self.total_page <= self.page_show_num:  #检测输入页码的合法性
            show_page = range(self.total_page-self.page_show_num, self.total_page + 1)
        else:
            if self.current_page <= mid_page:
                show_page = range(1, self.page_show_num+1)
            elif self.current_page + mid_page >= self.total_page:
                show_page = range(self.total_page - self.page_show_num +1, self.total_page + 1)
            else:
                show_page = range(self.current_page - mid_page, self.current_page + mid_page+1)
        return show_page

    #获取当前页,开始条数
    @property
    def start(self):
        return (self.current_page - 1) * 5

    #获取当前页结束条数
    @property
    def end(self):
        end_page_num=0
        cur_num=(self.current_page-1)*self.page_size
        if cur_num+self.page_size > self.total_num:
            end_page_num=self.total_num
        else:
            end_page_num=cur_num+self.page_size
        return end_page_num

    #获取上一页
    @property
    def pre_page(self):
        page_str=''
        if self.current_page>1:
            page_str = '<a href="%s%s">上一页</a>'%(self.base_url,self.current_page - 1)
        return page_str

    #获取下一页
    @property
    def next_page(self):
        page_str=''
        if self.current_page < self.total_page:
            page_str = '<a href="%s%s">下一页</a>'%(self.base_url,self.current_page + 1)
        return page_str

    #获取第一页
    @property
    def first_page(self):
        page_str=''
        if self.total_page>1 and self.current_page!=1:
            page_str='<a href="%s1">首页</a>'%self.base_url
        return page_str

    #获取尾页
    @property
    def last_page(self):
        page_str=''
        if self.total_page>1 and self.current_page!=self.total_page:
            page_str = '<a href="%s%s">尾页</a>' % (self.base_url,self.total_page)
        return page_str

    #拼接html和javascript进行跳转页面
    @property
    def go_page(self):
        page_str=''
        if self.total_page>1:
            inp="""<input type='text' /><a onclick="Jump('%s',this)">GO</a>"""%(self.base_url)
            script="""
                <script>
                    function Jump(baseUrl,ths){
                        var v=ths.previousElementSibling.value;
                        if(v.trim().length>0){
                            location.href=baseUrl+v;
                        }
                    }
                </script>
            """
            page_str=inp+script
        return page_str

    #返回模板页面所需要显示的html,需要在模板也进行还原, {% raw XXX %}
    @property
    def page_str(self):
        page_list=self.get_list()
        page_list_num=[]
        page_list_num.append(self.first_page)
        page_list_num.append(self.pre_page)
        for p in page_list:
            if self.current_page==p:
                temp="<a href='%s%s' class='cur'>%s</a>"%(self.base_url,p,p)
            else:
                temp = "<a href='%s%s'>%s</a>" % (self.base_url, p, p)
            page_list_num.append(temp)
        page_list_num.append(self.next_page)
        page_list_num.append(self.last_page)
        page_list_num.append(self.go_page)
        return ''.join(page_list_num)


class IndexHandler(tornado.web.RequestHandler):
    #使用分页类
    def get(self,page):
        total_page = int(ceil(len(LIST_INFO) / 5))
        #获取页面分页信息
        Page=Pagination(page,len(LIST_INFO)) #传入的page数据是通过url过滤的,只会是数字,为正数,所以上面类中只需要考虑用户输入过大
        #获取数据信息
        info = LIST_INFO[Page.start:Page.end]

        self.render('home/index.html', list_info=info, p=int(page), sp=Page.page_str)

    #原来分页方式,不使分页类,适用性不高
    def get2(self,page):
        try:
            page = int(page)
        except:
            page=1
        if page<1:
            page=1
        #每页显示5条,page是当前页
        total_page = int(ceil(len(LIST_INFO)/5))
        cur=(page-1)*5
        info=[]
        show_page=[]
        if cur+5 > len(LIST_INFO):
            info = LIST_INFO[cur:]
        else:
            info = LIST_INFO[cur:cur+5]
        if total_page <= 11:
            show_page=range(1,total_page+1)
        else:
            if page <= 5:
                show_page=range(1,12)
            elif page+5>=total_page:
                show_page=range(total_page-10,total_page+1)
            else:
                show_page=range(page-5,page+6)
        self.render('home/index.html',list_info=info,p=page,tp=total_page,sp=show_page)

    #接收post传递数据
    def post(self, page):
        user = self.get_argument('username')
        email = self.get_argument('email')
        temp = {'username':user,'email':email}
        LIST_INFO.append(temp)
        self.redirect('/index/'+page)

前端模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    .page a{
        margin-left: 5px;
        padding: 5px;
        background-color: lawngreen;
    }
    .page a:hover{
        background-color: rebeccapurple;
    }
    .page .cur{
        background-color: gold !important;
    }
</style>
<body>
    <h1>提交数据</h1>
    <form method="post" action="/index/{{p}}">
        <input name="username" type="text"/>
        <input name="email" type="text"/>
        <input type="submit" value="提交"/>
    </form>
    <h1>显示数据</h1>
    <table>
        <tr>
            <th>用户名</th>
            <th>邮箱</th>
        </tr>
        {% for line in list_info %}
            <tr>
                <td>{{line['username']}}</td>
                <td>{{line['email']}}</td>
            </tr>
        {% end %}
    </table>
    <div class="page">
        {% raw sp %}
    </div>
</body>
</html>
原文地址:https://www.cnblogs.com/ssyfj/p/8525070.html