【Django】列表分页插件

功能:分页组件
使用:
【views.py】
第一步:

from xitong.uitls.Pagenation import Pagenation

第二步:
定义queryset,并且实例化列表类

base_url = request.get_full_path_info()  # 获取当前url(可带参数)
queryset = Psons.objects.filter(name__contains=keyword)
fengye = Pagenation(request, queryset, base_url, data_size=2, page_size=5, page_can="page")

第三步:

content = {
“datas”:fengye.queryset, # 显示数据
“html”:fengye.html(), # 显示页码
}
return render(request,‘list.html’,content)

【模板:list.html】

{% for ps in datas %}
     {{ ps.name }}
     ...
{% endfor %}

<nav aria-label="Page navigation">
    <ul class="pagination">
        {{ html }}
    </ul>
</nav>

以下源代码:

from django.utils.safestring import mark_safe
import urllib.parse as urlparse
from urllib.parse import urlencode

class Pagenation(object):
    # 参数:
    # request               # 引入请求对象
    # queryset              # 筛选获取数据
    # base_url              # 基础url(可以带参数的)
    # data_size = 10        # 每一页显示数据条数,默认为10
    # page_size = 5         # 页码增加前 / 后几页
    # page_can = "page"     #url传达参数名,默认为 ?page

    def __init__(self,request,queryset,base_url, data_size = 10, page_size = 5, page_can = "page"):
        self.base_url = base_url
        parsed = urlparse.urlparse(self.base_url)
        querys = urlparse.parse_qs(parsed.query)
        querys = {k: v[0] for k, v in querys.items()}

        if page_can in querys:
            ''' url中有page参数情况'''
            page = int(querys[page_can][0])
            querys.pop(page_can)
            self.last_url = urlencode(querys)
        else:
            ''' url中没有page参数 '''
            self.last_url = ''
            page = 1

        self.page = page                     # url分页参数
        self.data_size = data_size           # 数据显示条数
        self.start_data = (page - 1) * data_size
        self.end_data = page * data_size
        self.queryset = queryset[self.start_data:self.end_data]

        self.page_size = page_size
        self.data_conent = queryset.count()       # 总数据条数
        page_count, b = divmod(self.data_conent, self.data_size)
        if b != 0:
            page_count += 1
        self.page_count = page_count         # 总共多少页码
        self.page_can = page_can

    def html(self):

        if self.data_conent:
            # 显示页码
            if self.page_count <= self.page_size * 2 + 1:
                # 数据比较少,未达到11页
                start_page = 1
                end_page = self.page_count
            else:
                # 数据比较多,超过11页
                if self.page <= self.page_size:
                    # 向前取极限,到 1
                    start_page = 1
                    end_page = self.page_size * 2 + 1
                else:
                    if (self.page + self.page_size) > self.page_count:
                        # 向后取极限 ,到总页数
                        start_page = self.page_count - self.page_size * 2
                        end_page = self.page_count
                    else:
                        # 中间情况,当前页 +/- 5
                        start_page = self.page - self.page_size
                        end_page = self.page + self.page_size
            fen_ye = []
            fen_ye.append('<li class="active"><a href="?' + self.page_can + '={}&{}">首 页</a></li>'.format(1,self.last_url))
            if self.page <= 1:
                up_page = '<li><a href="?' + self.page_can + '={}&{}">上一页</a></li>'.format(1,self.last_url)
            else:
                up_page = '<li><a href="?' + self.page_can + '={}&{}">上一页</a></li>'.format(self.page - 1,self.last_url)
            fen_ye.append(up_page)

            for i in range(start_page, end_page + 1):
                if i == self.page:
                    xml = '<li class="active"><a href="?' + self.page_can + '={}&{}">{}</a></li>'.format(i,self.last_url, i)
                else:
                    xml = '<li><a href="?' + self.page_can + '={}&{}">{}</a></li>'.format(i,self.last_url, i)
                fen_ye.append(xml)

            if self.page >= self.page_count:
                down_page = '<li><a href="?' + self.page_can + '={}&{}">下一页</a></li>'.format(self.page_count,self.last_url)
            else:
                down_page = '<li><a href="?' + self.page_can + '={}&{}">下一页</a></li>'.format(self.page + 1,self.last_url)
            fen_ye.append(down_page)
            fen_ye.append('<li class="active"><a href="?' + self.page_can + '={}&{}">尾 页</a></li>'.format(self.page_count,self.last_url))

        else:
            fen_ye = ['<h5 style="color: #337ab7; padding-left: 20px;">空空如也,没有内容哦!</h5>']
        html = mark_safe(' '.join(fen_ye))
        return html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值