• django分页


    分页一(简单自定制):

    url:http://127.0.0.1:8000/index/?p=1
    
    >>>views.py 
    USER_LIST = []
    for i in range(1,999):
        temp = {'name':'root'+str(i),'age':i}
        USER_LIST.append(temp)
    
    def index(request):
        per_page_count = 10
        current_page = request.GET.get('p')
        current_page = int(current_page)
        start = (current_page-1)*10
        end = current_page*per_page_count
        data = USER_LIST[start:end]
        if current_page <= 1:
            prev_page = 1
        else:
            prev_page = current_page - 1
        if current_page >= (len(USER_LIST)//per_page_count) + 1:
            next_page = (len(USER_LIST)//per_page_count) + 1
        else:
            next_page = current_page + 1
        return render(request,'index.html',locals())
    
    >>>html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <ul>
        {% for row in data %}
            <li>{{ row.name }}-{{ row.age }}</li>
        {% endfor %}
    </ul>
    <a href="/index/?p={{ prev_page }}">上一页</a>
    <a href="/index/?p={{ next_page }}">下一页</a>
    
    </body>
    </html>

     分页二(内置模块):

    USER_LIST = []
    for i in range(1,999):
        temp = {'name':'root'+str(i),'age':i}
        USER_LIST.append(temp)
    
    >>>views
    def index1(request):
        from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
        current_page = request.GET.get('p')
        paginator = Paginator(USER_LIST,10)
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象
        try:
            posts = paginator.page(current_page)
            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)
    
        return render(request,'index1.html',locals())
    
    >>>html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <ul>
        {% for row in posts.object_list %}
            <li>{{ row.name }}-{{ row.age }}</li>
        {% endfor %}
    </ul>
    
    {% if posts.has_previous %}
        <a href="/index1/?p={{ posts.previous_page_number }}">上一页</a>
    {% endif %}
    
    {% if posts.has_next %}
        <a href="/index1/?p={{ posts.next_page_number }}">下一页</a>
    {% endif %}
    
    <span>
        {{ posts.number }}/{{ posts.paginator.num_pages }}
    </span>
    
    </body>
    </html>

    分页三(内置模块扩展):

    >>>views
    from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
    USER_LIST = []
    for i in range(1,666):
        temp = {'name':'root'+str(i),'age':i}
        USER_LIST.append(temp)
    
    class CustomPaginator(Paginator):
        def __init__(self,current_page,per_page_num,*args,**kwargs):
            #当前页
            self.current_page = int(current_page)
            #最多显示的页码数量
            self.per_page_num = int(per_page_num)
            super(CustomPaginator,self).__init__(*args,**kwargs)
    
        def page_num_page(self):
            #数据的总页数<设置显示的页数  就直接显示总的页数
            if self.num_pages <self.per_page_num:
                return range(1,self.num_pages+1)
         #总页数特别多
            part = int(self.per_page_num/2)
            if self.current_page <= part:
                return range(1,self.per_page_num+1)
            if (self.current_page + part) > self.num_pages:
                return range(self.num_pages-self.per_page_num+1,self.num_pages+1)
    
            return range(self.current_page-part,self.current_page+part+1)
    
        
    def index1(request):
    
        current_page = request.GET.get('p')
        paginator = CustomPaginator(current_page,7,USER_LIST,10)
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象
        try:
            posts = paginator.page(current_page)
            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)
    
        return render(request,'index1.html',locals())
    
    >>>html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <ul>
        {% for row in posts.object_list %}
            <li>{{ row.name }}-{{ row.age }}</li>
        {% endfor %}
    </ul>
    
    
    {% if posts.has_previous %}
        <a href="/index1/?p={{ posts.previous_page_number }}">上一页</a>
    {% endif %}
    
    {% for i in posts.paginator.page_num_page %}
    {
    % if i == posts.number %} <a style="font-size: 30px" href="/index1/?p={{ i }}">{{ i }}</a> {% else %} <a href="/index1/?p={{ i }}">{{ i }}</a> {% endif %} {% endfor %} {% if posts.has_next %} <a href="/index1/?p={{ posts.next_page_number }}">下一页</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </body> </html>

     分页四(复杂自定制):

    >>>pager.py
    
    class Pagination(object):
        #可调参数  perpageItemNum=10   每页显示的条数
        #可调参数  maxPageNum=7        每次显示页数
        #可调参数  totalCount=666      数据的总个数
        def __init__(self,currentPage,totalCount=666,perpageItemNum=10,maxPageNum=7):
            #数据总个数 total_count
            # 当前页    current_page
            # 每页显示的条数 perpage_item_num
            # 每次显示页数  max_page_num
            self.total_count = totalCount
            try:
                v = int(currentPage)
                if v <= 0:
                    v = 1
                self.current_page = v
            except Exception as e:
                self.current_page = 1
            self.perpage_item_num = perpageItemNum
            self.max_page_num = maxPageNum
    
        # 当前页面的起始值
        def start(self):
            #当前页数-1 * 显示的条数
            return (self.current_page-1) * self.perpage_item_num
    
        # 当前页面的终止值
        def end(self):
            # 当前页数 * 显示的条数
            return self.current_page * self.perpage_item_num
    
        #总的页码数
        @property     #加了之后 可以直接调用self.num_pages 不需要再调用self.num_pages()
        def num_pages(self):
            a,b = divmod(self.total_count,self.perpage_item_num)
            if b == 0:
                return a
            return a+1
    
        #现实的页面数跳动
        def page_num_page(self):
            # 数据的总页数<设置显示的页数  就直接显示总的页数
            if self.num_pages < self.max_page_num:
                return range(1, self.num_pages + 1)
            part = int(self.max_page_num / 2)
            if self.current_page <= part:
                return range(1, self.max_page_num + 1)
            if (self.current_page + part) > self.num_pages:
                return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1)
            return range(self.current_page - part, self.current_page + part + 1)
    
        #生成显示页面数字
        def page_str(self):
            page_list =[]
            first = "<li><a href='/index2/?p=1'>首页</a></li>"
            page_list.append(first)
    
            if self.current_page == 1:
                prev = "<li><a href='#'>上一页</a></li>"
            else:
                prev = "<li><a href='/index2/?p=%s'>上一页</a></li>"%(self.current_page-1)
            page_list.append(prev)
    
            for i in self.page_num_page():
                if i == self.current_page:
                    temp = "<li class='active'><a href='/index2/?p=%s'>%s</a></li>"%(i,i)
                else:
                    temp = "<li><a href='/index2/?p=%s'>%s</a></li>" % (i, i)
                page_list.append(temp)
    
            if self.current_page == self.num_pages:
                nexts = "<li><a href='#'>下一页</a></li>"
            else:
                nexts = "<li><a href='/index2/?p=%s'>下一页</a></li>"%(self.current_page+1)
            page_list.append(nexts)
    
            last = "<li><a href='/index2/?p=%s'>尾页</a></li>"%self.num_pages
            page_list.append(last)
    
            return ''.join(page_list)
    
    >>>views
    def index2(request):
        from app1.pager import Pagination
        #获取用户点击发过来的请求页面
        current_page = request.GET.get('p')
        page_obj = Pagination(current_page)
    
        data = USER_LIST[page_obj.start():page_obj.end()]
        return render(request,'index2.html',locals())
    
    >>>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>
    
    <ul>
        {% for row in data %}
            <li>{{ row.name }}-{{ row.age }}</li>
        {% endfor %}
    </ul>
    
    <ul class="pagination pagination-sm">
    
            {{ page_obj.page_str|safe }}
    
          </ul>
    
    </body>
    </html>
  • 相关阅读:
    软件测试课堂练习
    JSP第一次作业
    安卓第六次作业
    安卓第五次作业
    第四次安卓作业
    JSP第四周
    软件测试课堂练习3.4
    Android数据库表
    Android购物菜单
    Android增删改查
  • 原文地址:https://www.cnblogs.com/yzcstart/p/10714787.html
Copyright © 2020-2023  润新知