python web框架 之 自定分页组件<万能应用版>

  最近学习了django 框架,感觉这个web框架很牛……but虽然自带分页功能,但是局限性太强,只能django框架自己使用!同时页面渲染出来的友好性也不高。

  索性那就自己定制一个分页组件,如果需要直接调用就好!

  注:为了好看,引用了bootstrap插件,还请各位老哥自行下载哈!

第一步:python用类实现的分页方法:

class PageInfo(object):
    def __init__(self,current_page,all_count,per_page,base_url,show_page=11):
        a, b = divmod(all_count, per_page)
        if b:
            a += 1
        self.all_pages = a  #获取总页数
        try:  #判断是否为数字整型
            self.current_page=int(current_page)  #当前页
        except Exception as e:
            self.current_page = 1  #异常直接跳到第一页
        self.per_page=per_page  # 每页多少条数据

        self.base_url = base_url #  url
        self.show_page = show_page  #页面要显示的页面个数

    def start(self):  #数据的起始位置
        return (self.current_page-1)*self.per_page

    def end(self):  #数据的结束位置
        return self.current_page*self.per_page

    #获取所有的页面前五个,后五个
    def pager(self):
        page_list = []
        half = int((self.show_page-1)/2)

        if self.current_page<=half:  #当前页码小于5时
            begin = 1
            stop = self.show_page + 1
        else:
            if self.current_page+half >= self.all_pages: #当前页码+5超过最大页时
                begin = self.all_pages - 11
                stop = self.all_pages + 1
            else:   #页码在整个总页码数的中间
                begin = self.current_page-half
                stop = self.current_page + half +1

        #上一页
        if self.current_page <=1:
            prov = "<li><a href='#'>上一页</a></li>"
        else:
            prov = "<li><a href='%s?page=%s'>上一页</a></li>"%(self.base_url,self.current_page-1)
        page_list.append(prov)
        # 中间10页
        for i in range(begin,stop):
            if i == self.current_page:
                v = "<li class='active'><a href='%s?page=%s'>%s</a></li>" % (self.base_url,i, i)
            else:
                v = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url,i, i)
            page_list.append(v)

        #下一页
        if self.current_page >=self.all_pages:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex = "<li><a href='%s?page=%s'>下一页</a></li>"%(self.base_url,self.current_page+1)
        page_list.append(nex)

        return "".join(page_list)

第二步,通过函数调用这个类内的方法:

def custom(request):

    all_count = models.UserInfo.objects.all().count()  #统计要操作的UserInfo表内有多少条数据
    page_info = PageInfo(request.GET.get("page"),all_count,10,"/custom") #实例化出一个对象
    user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()] #[起始位置:结束位置]

    return render(request,"custom.html",{"user_list":user_list,"page_info":page_info})#把类对象传递到页面

第三步,模版页面渲染<custom.html文件>:

<!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>
    <h3>用户列表</h3>
    <ul>
        {% for row in user_list %}
            <li>{{ row.name }}</li>
        {% endfor %}
    </ul>
    
    {#使用的是bootstrap插件中的方法渲染选择框#}
    <nav aria-label="Page navigation">
        <ul class="pagination">
          {{ page_info.pager|safe }}
        </ul>
    </nav>

{#{{ page_info.pager|safe }} {# 注意:页码接收到对象之后,直接调用其方法,不需要加括号,页面会自动执行渲染!#}
   {# 语法:{{ 对象名.方法|safe}} 告诉页面这代码是安全的 #}
</body>
</html>

以上仅仅是一个分页功能的简单实现。开发的时候,把代码粘贴出来,导入引用!

 

posted @ 2017-06-27 16:35  细雨蓝枫  阅读(141)  评论(0编辑  收藏  举报