分页组件

1.普通分页

.py

from django.shortcuts import render

# Create your views here.

user_list = []
for i in range(1, 1000):
    user = {'name': 'user' + str(i), 'age': 'age' + str(i)}
    user_list.append(user)


def index(request):
    page_count = 10
    current_page = request.GET.get('p')
    current_page = int(current_page)

    start = (current_page - 1) * page_count
    end = current_page * page_count
    user_list_onepage = user_list[start:end]

    pre_page = current_page - 1
    next_page = current_page + 1
    return render(request, 'index.html',
                  {'user_list_onepage': user_list_onepage, 'pre_page': pre_page, 'next_page': next_page})


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
{% for item in user_list_onepage %}
    <li>{{ item.name }}--{{ item.age }}</li>
{% endfor %}
</ul>
<a href="/index?p={{ pre_page }}">上一页</a>
<a href="/index?p={{ next_page }}">下一页</a>
</body>
</html>


2.django内置分页

.py

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', {'posts': posts})


index1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
{% for item in posts.object_list  %}
    <li>{{ item.name }}--{{ item.age }}</li>
{% endfor %}
</ul>

{% if posts.has_previous %}
    <a href="/index1?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
    <a href="#">上一页</a>


3.django内置分页扩展

 
views.py

# django 分页自定制
class CustomPaginator(Paginator):
    def __init__(self,current_page,per_page_num,*args,**kwargs):
        super(CustomPaginator,self).__init__(*args,**kwargs)
        self.current_page=int(current_page)
        self.per_page_num=int(per_page_num)

    def pager_num_range(self):
        part=int(self.per_page_num/2)
        #总页数少于per_pager_num
        if self.num_pages<=self.per_page_num:
            return range(1,self.num_pages+1)

        # 当前页数少于per_pager_num的一半
        if self.current_page<=part:
            return range(1,self.per_page_num+1)
        # 当前页数+per_pager_num的一半大于总页面数
        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+1,self.current_page+part+1)
def index2(request):
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    current_page = request.GET.get('p')

    paginator = CustomPaginator(current_page,10,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, 'index2.html', {'posts': posts})


4.自定制万能分页框架
pager.py
class Paginator(object):
    def __init__(self,total_count,current_page_num,per_page_num=30,max_page_num=10):
        #数据总个数
        self.total_count=int(total_count)
        #当前页数
        try:
            self.current_page_num=int(current_page_num)
        except Exception as e:
            self.current_page_num = 1
        #每一页数据个数
        self.per_page_num=int(per_page_num)
        #页码数
        self.max_page_num=int(max_page_num)

        #上一页
        self.previous_page_num
 =int(current_page_num)-1
        #下一页
        self.next_page_num = int(current_page_num) + 1

    def start(self):
        return (self.current_page_num-1) *  self.per_page_num

    def end(self):
        return self.current_page_num *  self.per_page_num
    #总页数
    @property
    def total_pager_num(self):
        a,b=divmod(self.total_count,self.per_page_num)
        if b==0:
            return a
        return a+1
    #页码
    def pager_num_range(self):
        part=int( self.max_page_num/2)

        #总页数少于max_page_num
        if self.total_pager_num<=self.max_page_num:
            return range(1,self.total_pager_num+1)

        # 当前页数少于per_pager_num的一半
        if self.current_page_num<=part:
            return range(1,self.max_page_num+1)
        # 当前页数+per_pager_num的一半大于总页面数
        if (self.current_page_num+part)>self.total_pager_num:
            return range(self.total_pager_num-self.max_page_num+1 , self.total_pager_num+1)
        #一般情况
        return range(self.current_page_num-part+1,self.current_page_num+part+1)
    #是否有上一页
    @property
    def has_previous(self):
        if self.current_page_num>1:
            return True

    # 是否有下一页
    @property
    def has_next(self):
        if self.current_page_num < self.total_pager_num :
            return True

    def page_str(self):
        str_list=[]
        first_page_str = '<a href = "/index3?p=1" > 首页 </a>'
        str_list.append(first_page_str)
        if self.has_previous:
            pre_page_str='<a href = "/index3?p=%s" > 上一页 </a>'%self.previous_page_num
        else:
            pre_page_str = '<a href = "/index3?p=1" > 上一页 </a>'
        str_list.append(pre_page_str)

        for item in self.pager_num_range():
            if item == self.current_page_num :
                temp='<a style = "color: red" href = "/index3?p=%s" > %s </a>'%(item,item)
            else :
                temp = '<a  href = "/index3?p=%s" > %s </a>' % (item, item)
            str_list.append(temp)
        if self.has_next:
            next_page_str='<a href = "/index3?p=%s" > 下一页 </a>'%self.next_page_num
        else:
            next_page_str = '<a href = "/index3?p=%s" > 下一页 </a>' % self.total_pager_num
        str_list.append(next_page_str)

        current_total_str='<span> %s/%s </span>'%(self.current_page_num,self.total_pager_num)
        str_list.append(current_total_str)

        last_page_str = '<a href = "/index3?p=%s" > 尾页 </a>'%self.total_pager_num
        str_list.append(last_page_str)

        return ''.join(str_list)

view.py

user_list = []
for i in range(1, 666):
    user = {'name': 'user' + str(i), 'age': 'age' + str(i)}
    user_list.append(user)
def index3(request):
    current_page=request.GET.get('p')
    obj=Paginator(666,current_page)
    data_list=user_list[obj.start():obj.end()]
    return render(request, 'index3.html', {'data': data_list,'obj':obj})

index3.html

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

{{ obj.page_str|safe }}

</body>
</html>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值