Day21-自定义分页

一. 先简单来个示例

1.1 在urls.py中增加1条,user_list

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

urlpatterns = [
    url(r'^tpl_1/', views.tpl_1),
    url(r'^tpl_2/', views.tpl_2),
    url(r'^tpl_3/', views.tpl_3),
    url(r'^tpl_4/', views.tpl_4),
    url(r'^user_list/', views.user_list),
]

 1.2 在views.py中写user_list函数 (后端)

LIST=[]
for i in range(100):
    LIST.append(i)
def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    start=(current_page-1)*10
    end=current_page*10
    data=LIST[start:end]
    return render(request,'user_list.html',{'li':data})

 1.3 写user_list.html模板 (前端)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {% for item in li %}
            {% include 'li.html' %}
        {%endfor%}
    </ul>
    <div>
        <a href="/user_list/?p=1">1</a>
        <a href="/user_list/?p=2">2</a>
        <a href="/user_list/?p=3">3</a>
    </div>
</body>
</html>

 1.4 写li.html

 

1.5 效果

 

 

二,上述的缺点:不知道该写多少个a标签,尝试把分页信息写到后端然后传给前端

views.py

LIST=[]
for i in range(100):
    LIST.append(i)
    page_str='''
        <a href="/user_list/?p=1">1</a>
        <a href="/user_list/?p=2">2</a>
        <a href="/user_list/?p=3">3</a>
    '''
def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    start=(current_page-1)*10
    end=current_page*10
    data=LIST[start:end]
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

user_list.html修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {% for item in li %}
            {% include 'li.html' %}
        {%endfor%}
    </ul>
    <div>
        {{page_str}}
    </div>
</body>
</html>

 效果:

 

这是出于安全的考虑,所有传来的字符串都认为是不安全的。如果想让其正常显示,需要加入safe,如下:

 

现在就可以正常显示了

 

三,另外一种方法:把字符串在后台包装一下,声明它是安全的。

 

四,根据内容的多少,自动实现分页

最终效果:

粘贴核心程序如下及部分说明:

count,y=divmod(all_count,10)-------取商和余数

page_str="".join(page_list)------以空格相连

 

page_str=mark_safe(page_str) ----------声明它们是安全的

urls.py

urlpatterns = [
    url(r'^tpl_1/', views.tpl_1),
    url(r'^tpl_2/', views.tpl_2),
    url(r'^tpl_3/', views.tpl_3),
    url(r'^tpl_4/', views.tpl_4),
    url(r'^user_list/', views.user_list),
]

 

views.py

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})
from django.utils.safestring import mark_safe
LIST=[]
for i in range(100):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    start=(current_page-1)*10
    end=current_page*10
    data=LIST[start:end]

    all_count = len(LIST)
    count,y=divmod(all_count,10)
    if y:
        count=count+1

    page_list=[]
    for i in range(1,count+1):
        if i==current_page:
            temp='<a class="page active" href="/user_list/?p=%s">%s</a>' %(i,i)
        else:
            temp='<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i)
        page_list.append(temp)

    page_str="".join(page_list)
    page_str=mark_safe(page_str)
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .pagination .page{
            display:inline-block;
            padding:5px;
            background-color:cyan;
            margin:5px;
        }
        .pagination .page.active{
            background-color:brown;
            color:white;
        }
    </style>
</head>
<body>
    <ul>
        {% for item in li %}
            {% include 'li.html' %}
        {%endfor%}
    </ul>
    <div class="pagination">
        {{page_str}}
    </div>
</body>
</html>

 

五,把分页写全,每页显示11条数据(当前选中页+前5+后5)

 

显示效果:

 

 

代码:

views.py

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})
from django.utils.safestring import mark_safe
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    per_page_count=10
    start=(current_page-1)*per_page_count
    end=current_page*per_page_count
    data=LIST[start:end]

    all_count = len(LIST)
    total_count,y=divmod(all_count,per_page_count)
    if y:
        total_count=total_count+1
    page_list=[]

    if total_count<11:
        start_index=1
        end_index=total_count+1
    else:
        if current_page<=6:
            start_index=1
            end_index=11+1
        else:
            start_index=current_page-5
            end_index=current_page+5+1
            if (current_page+5)>total_count:
                end_index=total_count+1
                start_index=total_count-10
                
    for i in range(start_index,end_index):
        if i==current_page:
            temp='<a class="page active" href="/user_list/?p=%s">%s</a>' %(i,i)
        else:
            temp='<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i)
        page_list.append(temp)

    page_str="".join(page_list)
    page_str=mark_safe(page_str)
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

把具体的页面数用变量代替,这样就可以让用户自己选择每页显示的数目了。

 

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})
from django.utils.safestring import mark_safe
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)

    per_page_count=10
    pager_num = 5

    start=(current_page-1)*per_page_count
    end=current_page*per_page_count
    data=LIST[start:end]

    all_count = len(LIST)
    total_count,y=divmod(all_count,per_page_count)
    if y:
        total_count=total_count+1
    page_list=[]

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

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

    page_str="".join(page_list)
    page_str=mark_safe(page_str)
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

完善功能,加上上一页,下一页的功能。

 

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})
from django.utils.safestring import mark_safe
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)

    per_page_count=10
    pager_num = 5

    start=(current_page-1)*per_page_count
    end=current_page*per_page_count
    data=LIST[start:end]

    all_count = len(LIST)
    total_count,y=divmod(all_count,per_page_count)
    if y:
        total_count=total_count+1
    page_list=[]

    if total_count<pager_num:
        start_index=1
        end_index=total_count+1
    else:
        if current_page<=(pager_num+1)/2:
            start_index=1
            end_index=pager_num+1
        else:
            start_index=current_page-(pager_num-1)/2
            end_index=current_page+(pager_num+1)/2
            if (current_page+(pager_num-1)/2)>total_count:
                end_index=total_count+1
                start_index=total_count-pager_num+1
    prev='<a class="page" href="/user_list/?p=%s">上一页</a>'%(current_page-1)
    page_list.append(prev)

    for i in range(int(start_index),int(end_index)):
        if i==current_page:
            temp='<a class="page active" href="/user_list/?p=%s">%s</a>' %(i,i)
        else:
            temp='<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i)
        page_list.append(temp)
    nex='<a class="page" href="/user_list/?p=%s">下一页</a>'%(current_page+1)
    page_list.append(nex)

    page_str="".join(page_list)
    page_str=mark_safe(page_str)
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

但是第一页没有“上一页”的功能,最后一页没有“下一页”的功能。

nex='<a class="page" href="javascript:void(0);">下一页</a>' 这里的 href="javascript:void(0);" 表示什么也不做的意思。

href="#” 也可以表示什么都不做的意思。

 

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})
from django.utils.safestring import mark_safe
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)

    per_page_count=10
    pager_num = 5

    start=(current_page-1)*per_page_count
    end=current_page*per_page_count
    data=LIST[start:end]

    all_count = len(LIST)
    total_count,y=divmod(all_count,per_page_count)
    if y:
        total_count=total_count+1
    page_list=[]

    if total_count<pager_num:
        start_index=1
        end_index=total_count+1
    else:
        if current_page<=(pager_num+1)/2:
            start_index=1
            end_index=pager_num+1
        else:
            start_index=current_page-(pager_num-1)/2
            end_index=current_page+(pager_num+1)/2
            if (current_page+(pager_num-1)/2)>total_count:
                end_index=total_count+1
                start_index=total_count-pager_num+1
    if current_page==1:
        prev='<a class="page" href="javascript:void(0);">上一页</a>'
    else:
        prev = '<a class="page" href="/user_list/?p=%s">上一页</a>' % (current_page - 1)
    page_list.append(prev)

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

    if current_page==total_count:
        nex='<a class="page" href="javascript:void(0);">下一页</a>'
    else:
        nex = '<a class="page" href="/user_list/?p=%s">下一页</a>' % (current_page + 1)
    page_list.append(nex)

    page_str="".join(page_list)
    page_str=mark_safe(page_str)
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

增加跳转到多少页的功能。写个input框,再加个按钮,绑定事件。

 

location.href:其实就是跳转的意思。 比如<a href=" www.hao123.com "></a> 这个a连接可以跳转到 www.hao123.com 上去。 
那么location.href = ' www.hao123.com ',同样是跳转到 www.hao123.com 上去。

 

    jump="""
    <input type='text'/><a onclick='jumpTo(this,"/user_list/?p=");'>Go</a>
    <script>
        function jumpTo(ths,base){
            var val=ths.previousSibling.value;  //由当前的a标签,获取到前一个input标签,然后得到input标签的内容。
            location.href=base+val;  //字符串拼接成:,"/user_list/?p=3" 的样子,然后做跳转。
        }  
    </script>
    """
    page_list.append(jump)

 

 写成这样也是可以的

jump='''     
<input type='text'/><a onclick='jumpTo(this);'>Go</a>
<script>
  function jumpTo(ths){
    var val=ths.previousSibling.value;
    location.href="/user_list/?p="+val;
}
</script> '''

 

 

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})
from django.utils.safestring import mark_safe
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)

    per_page_count=10
    pager_num = 5

    start=(current_page-1)*per_page_count
    end=current_page*per_page_count
    data=LIST[start:end]

    all_count = len(LIST)
    total_count,y=divmod(all_count,per_page_count)
    if y:
        total_count=total_count+1
    page_list=[]

    if total_count<pager_num:
        start_index=1
        end_index=total_count+1
    else:
        if current_page<=(pager_num+1)/2:
            start_index=1
            end_index=pager_num+1
        else:
            start_index=current_page-(pager_num-1)/2
            end_index=current_page+(pager_num+1)/2
            if (current_page+(pager_num-1)/2)>total_count:
                end_index=total_count+1
                start_index=total_count-pager_num+1
    if current_page==1:
        prev='<a class="page" href="javascript:void(0);">上一页</a>'
    else:
        prev = '<a class="page" href="/user_list/?p=%s">上一页</a>' % (current_page - 1)
    page_list.append(prev)

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

    if current_page==total_count:
        nex='<a class="page" href="javascript:void(0);">下一页</a>'
    else:
        nex = '<a class="page" href="/user_list/?p=%s">下一页</a>' % (current_page + 1)
    page_list.append(nex)

    jump="""
    <input type='text'/><a onclick='jumpTo(this,"/user_list/?p=");'>Go</a>
    <script>
        function jumpTo(ths,base){
            var val=ths.previousSibling.value;
            location.href=base+val;
        }   
    </script>
    """
    page_list.append(jump)

    page_str="".join(page_list)
    page_str=mark_safe(page_str)
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 效果:

 

六。把分页的功能写到一个类里面,以后用这个类来做操作就可以了。

 

__init__(self,current_page,data_count,per_page_count=10,pager_num=7---------接收用户传来的参数并且封装值。
self.current_page=current_page---------开始封装功能
def start(self): 写2个方法
def end(self):写2个方法

per_page_count=10,pager_num=7: 因为这两个值不常修改,所以我们可以给它们写上默认值。
page_obj=Page(current_page,len(LIST)) : 实例化一个类


if self.total_count() < self.pager_num: 这里的total_count是一个类,调用的时候,应该加上括号。
当想访问类里面的方法,但是又不想加括号的话,可以在父类里面写上 @property

views.py
from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})

class Page:
    def __init__(self,current_page,data_count,per_page_count=10,pager_num=7):
        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 = v + 1
        return v

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

        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 = '<a class="page" href="javascript:void(0);">上一页</a>'
        else:
            prev = '<a class="page" href="%s?p=%s">上一页</a>' % (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 = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url,i, i)
            else:
                temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url,i, i)
            page_list.append(temp)

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

        jump = """
        <input type='text'/><a onclick='jumpTo(this,"%s?p=");'>Go</a>
        <script>
            function jumpTo(ths,base){
                var val=ths.previousSibling.value;
                location.href=base+val;
            }   
        </script>
        """%(base_url,)
        page_list.append(jump)

        page_str = "".join(page_list)
        page_str = mark_safe(page_str)
        return page_str

from django.utils.safestring import mark_safe
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    page_obj=Page(current_page,len(LIST))
    data=LIST[page_obj.start:page_obj.end]
    page_str=page_obj.page_str("/user_list/")
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

精简版本
views.py
from django.shortcuts import render,HttpResponse
from django.utils.safestring import mark_safe
# Create your views here.

class Page:
    def __init__(self,current_page,data_count,per_page_count=10,pager_num=7):
        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 = v+ 1
        return v

    def page_str(self):
        page_list = []
        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 = '<a class="page" href="javascript:void(0)">上一页</a>'
        else:
            prev = '<a class="page" href="/user_list/?p=%s">上一页</a>' % (self.current_page - 1)
        page_list.append(prev)

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

        if self.current_page == self.total_count:
            nex = '<a class="page" href="javascript:void(0);">下一页</a>'
        else:
            nex = '<a class="page" href=/user_list/?p=%s>下一页</a>' % (self.current_page + 1)
        page_list.append(nex)

        jump = '''
            <input type='text'/><a onclick='jumpTo(this,"/user_list/?p=");'>Go</a>
            <script>
                function jumpTo(ths,base){
                    var val=ths.previousSibling.value;
                    location.href=base+val;
                }
            </script>
        '''

        page_list.append(jump)
        page_str = mark_safe("".join(page_list))
        return page_str

LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    page_obj=Page(current_page,len(LIST))
    data=LIST[page_obj.start:page_obj.end]
    page_str=page_obj.page_str()
    return render(request,'user_list.html',{'data':data,'page_str':page_str})
 
def page_str(self,base_url): 把url也当做参数写到函数里面,这样就可以根据需求变化了。

views.py
from django.shortcuts import render,HttpResponse
from django.utils.safestring import mark_safe
# Create your views here.

class Page:
    def __init__(self,current_page,data_count,per_page_count=10,pager_num=7):
        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 = v+ 1
        return v

    def page_str(self,base_url):
        page_list = []
        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 = '<a class="page" href="javascript:void(0)">上一页</a>'
        else:
            prev = '<a class="page" href="%s?p=%s">上一页</a>' % (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 = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url,i, i)
            else:
                temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url,i, i)
            page_list.append(temp)

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

        jump = '''
            <input type='text'/><a onclick='jumpTo(this,"%s?p=");'>Go</a>
            <script>
                function jumpTo(ths,base){
                    var val=ths.previousSibling.value;
                    location.href=base+val;
                }
            </script>
        '''%(base_url)

        page_list.append(jump)
        page_str = mark_safe("".join(page_list))
        return page_str

LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    page_obj=Page(current_page,len(LIST))
    data=LIST[page_obj.start:page_obj.end]
    page_str=page_obj.page_str("/user_list/")
    return render(request,'user_list.html',{'data':data,'page_str':page_str})

 写在这里太长了,我们可以把它们挪到别处。新建utils文件夹----新建pagination.py文件

 

pagination.py

from django.utils.safestring import mark_safe
class Page:
    def __init__(self,current_page,data_count,per_page_count=10,pager_num=7):
        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 = v + 1
        return v

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

        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 = '<a class="page" href="javascript:void(0);">上一页</a>'
        else:
            prev = '<a class="page" href="%s?p=%s">上一页</a>' % (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 = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url,i, i)
            else:
                temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url,i, i)
            page_list.append(temp)

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

        jump = """
        <input type='text'/><a onclick='jumpTo(this,"%s?p=");'>Go</a>
        <script>
            function jumpTo(ths,base){
                var val=ths.previousSibling.value;
                location.href=base+val;
            }   
        </script>
        """%(base_url,)
        page_list.append(jump)

        page_str = "".join(page_list)
        page_str = mark_safe(page_str)
        return page_str

 

views.py中的调用方法

from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.

def tpl_1(request):
    user_list=[1,2,3,4]
    return render(request,'tpl_1.html',{'u':user_list})
def tpl_2(request):
    name='root'
    return render(request,'tpl_2.html',{'name':name})
def tpl_3(request):
    status='已删除'
    return render(request,'tpl_3.html',{'status':status})
def tpl_4(request):
    name='AAABBBIYMFD12345'
    return render(request,'tpl_4.html',{'name':name})

from utils import pagination
LIST=[]
for i in range(200):
    LIST.append(i)

def user_list(request):
    current_page=request.GET.get('p')
    current_page=int(current_page)
    page_obj=pagination.Page(current_page,len(LIST))
    data=LIST[page_obj.start:page_obj.end]
    page_str=page_obj.page_str("/user_list/")
    return render(request,'user_list.html',{'li':data,'page_str':page_str})

 

最终效果同上

 

七,在浏览器中让用户自己选择每页显示的条数

 

posted on 2017-10-16 14:23  momo8238  阅读(174)  评论(0编辑  收藏  举报