1. 程式人生 > 實用技巧 >Python學習第163天(分頁初步實現)

Python學習第163天(分頁初步實現)

  先說一下自行實現分頁是如何進行的

USER_LIST=[]
# 1.類似於我們從資料庫中查收到的所有資料
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp)

def index(req):
per_page_count =10
# 2.設定每頁顯示的資訊的個數
current_page =req.GET.get('p')
# 3.通過前段獲取當前所在頁面的頁碼
current_page = int(current_page) # 此時獲得的頁碼資料型別為字串,需要進行格式轉換
# p = 1
start = (current_page-1)*per_page_count
end = current_page*per_page_count
# 4.通過當前頁資訊獲取本頁顯示的所有內容範圍
data = USER_LIST[start:end]
# 5.通過內容標籤的範圍來確定本頁顯示內容,並將此資料返回給前段
prev_count = current_page-1
next_count = current_page+1
# 6.上一頁和下一頁就是通過將p值減一或加一,然後重新整理頁面重新提交
return render(req,'index.html',{'user_list':data,'next_page':next_count,'prev_page':prev_count})

  然後是關於Django自帶的分頁內容,這裡主要集中了兩個類,分別是Paginator、Page

  Paginator可以通過內建的page方法生成Page物件,反之Page類也可以這樣操作

  

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

L = []
for i in range(999):
    L.append(i)

def index(request):
    current_page = request.GET.get
('p') paginator = Paginator(L, 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, 'index.html', {'posts': posts}) views.py

下面說一下Django存在的不足,我們常見的翻頁中都應該如下圖

變大的是當前頁面,左右各有幾個數字然後是上一頁,和下一頁

下面我們需要對Paginator進行一定的修改,所以我們可以重新寫一個類,繼承Paginator所有的方法,再增加新的方法用於實現顯示數字的功能

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 pager_num_range(self):
        # self.num_pages 表示總共有多少頁
        # 情況1:當總頁數小於我們要顯示的頁碼個數
        if self.num_pages<self.per_page_num:
            return range(1,self.num_pages+1)
        part = int(self.per_page_num/2)
        # 情況2:我們需要顯示10個頁碼,但是此時當前頁為第2頁,依舊顯示1-10
        if self.current_page<=part:
            return range(1,self.per_page_num+1)
        # 情況3:我們需要顯示10個頁碼,共有20頁,但是此時當前頁為第18頁,依舊顯示11-20
        if (self.current_page+part)>self.num_pages:
            return range(self.num_pages-self.per_page_num,self.num_pages+1)
        # 情況4:正常的中間情況
        return range(self.current_page-part,self.current_page+part+1)

def index1(req):
#內建的很多資料
# per_page: 每頁顯示條目數量
# count: 資料總個數
# num_pages:總頁數
# page_range:總頁數的索引範圍,如: (1,10),(1,200)
# page: page物件(封裝是否有下一頁和上一頁,如果有,就會得到下一頁的頁碼
current_page = req.GET.get('p')
paginator = CustomPaginator(current_page,9,USER_LIST,10)
# Django自帶的分頁方法,傳遞USER_LIST即為所有的資料,
# 如果是使用資料庫操作就可以直接寫modles.Stundets.objuct.all()即可
try:
posts = paginator.page(current_page)
# posts 就是一個page物件
# has_next 是否有下一頁
# next_page_number 下一頁頁碼
# has_previous 是否有上一頁
# previous_page_number 上一頁頁碼
# object_list 分頁之後的資料列表,已經完成切片的資料
# number 當前頁
# paginator paginator物件(使之可以與Paginator物件可以進行相互轉換)
except PageNotAnInteger:# 所輸入的資料不是頁碼的情況
posts = paginator.page(1)
except EmptyPage: # 所輸入的頁碼超過頁碼範圍
posts = paginator.page(paginator.num_pages)
return render(req,'index1.html',{'posts':posts})

然後是對應的前端

<!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>
    {% include 'include/pager.html' %}
{% if posts.has_previous %}
        <a href="/index1.html?p={{ posts.previous_page_number }}">上一頁</a>
{#    {% else %}#}
{#        <a href="#">上一頁</a>#}
    {% endif %}

{% for i in posts.paginator.pager_num_range %}
    {% if i == posts.number %}
        <a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a>
    {% else %}
        <a href="/index1.html?p={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

    {% if posts.has_next %}
        <a href="/index1.html?p={{ posts.next_page_number }}">下一頁</a>
    {% else %}
        <a href="">下一頁</a>
    {% endif %}

    <span>
        {{ posts.number }}/{{ posts.paginator.num_pages }}
    </span>
</html>

以上就是關於分頁的所有內容。