一楷力、自帶分頁,一些常用參數(shù)
注明函數(shù)中的paginator.page(current_page)
更多的使用在html頁面棍弄,current_page
用來接收前端返回的頁數(shù)值
-
import 引入
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-
負(fù)責(zé)后臺(tái)處理的Paginator函數(shù)
paginator = Paginator(USER_LIST,10)
兩個(gè)參數(shù)分別接收檬嘀,數(shù)據(jù)庫中的總條數(shù),和每頁顯示多少條握侧,其他的返回函數(shù)分別有:
# per_page: 每頁顯示條目數(shù)量
# count: 數(shù)據(jù)總個(gè)數(shù)
# num_pages:總頁數(shù)
# page_range:總頁數(shù)的索引范圍蚯瞧,如: (1,10),(1,200)
# page: page對(duì)象(是否具有上一頁,下一頁)
-
用來處理前端的page品擎,也是Paginator返回函數(shù)
用來判斷是否具有上一頁埋合,下一頁,因此接收的是孽查,頁面返回的頁數(shù)
posts = paginator.page(current_page)
,頁數(shù)有不確定性所以用異常處理做處理饥悴,常見的返回函數(shù)
# has_next 是否有下一頁
# next_page_number 下一頁頁碼
# has_previous 是否有上一頁
# previous_page_number 上一頁頁碼
# object_list 分頁之后的數(shù)據(jù)列表
# number 當(dāng)前頁
# paginator paginator對(duì)象
-
代碼案例
def index1(request):
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
current_page = request.GET.get('page')
paginator = Paginator(USER_LIST,10)
# per_page: 每頁顯示條目數(shù)量
# count: 數(shù)據(jù)總個(gè)數(shù)
# num_pages:總頁數(shù)
# page_range:總頁數(shù)的索引范圍,如: (1,10),(1,200)
# page: page對(duì)象(是否具有上一頁盲再,下一頁)
try:
posts = paginator.page(current_page)
# has_next 是否有下一頁
# next_page_number 下一頁頁碼
# has_previous 是否有上一頁
# previous_page_number 上一頁頁碼
# object_list 分頁之后的數(shù)據(jù)列表
# number 當(dāng)前頁
# paginator paginator對(duì)象
except EmptyPage:
posts = paginator.page(paginator.num_pages)
except PageNotAnInteger:
posts = paginator.page(1)
return render(request,'index1.html',{'posts':posts})
-
在前端處理的時(shí)候
可以在templates西设,目錄下創(chuàng)建include文件夾,里面放置寫好的分頁前端的代碼塊答朋,用{% include 'incldue/pager.html' %}調(diào)用部分代碼
//是否有上一頁
{% if posts.has_previous %}
<a href="/index1?page={{ posts.previous_page_number }}">上一頁</a>
//沒有上一頁贷揽,不讓點(diǎn)擊
{% else %}
<a href="#">上一頁</a>
{% endif %}
//是否有下一頁
{% if posts.has_next%}
<a href="/index1?page={{ posts.next_page_number }}">下一頁</a>
//沒有下一頁,不讓點(diǎn)擊
{% else %}
<a href="#">下一頁</a>
{% endif %}
數(shù)據(jù)展示用的是has_previous
函數(shù)
<ul>
{% for i in posts %}
<li>{{ i }}</li>
{% endfor %}
</ul>
二梦碗、自定制
python 自帶的分頁禽绪,由于妻子輸入你的功能缺陷蓖救,我們可以對(duì)其自定制,讓頁面展示底欄的頁數(shù)印屁,還可以進(jìn)行跳轉(zhuǎn)設(shè)置
-
原理
想要在html頁面改變效果循捺,就要對(duì)Paginator.page進(jìn)行處理,為了避免在源碼直接處理的尷尬雄人,選著繼承的方式从橘,整體的思路如下:
#保證循環(huán)的次數(shù)在規(guī)定的展示欄個(gè)數(shù),如果設(shè)置11础钠,循環(huán)的次數(shù)保證在11次
class CustomPaginator(Paginator):
def __init__(self, current_page, per_pager_num,*args, **kwargs):
'''
:param current_page: 當(dāng)前頁
:param per_pager_num: 底邊欄展示頁數(shù)
'''
self.current_page = int(current_page)
self.per_pager_num = int(per_pager_num)
super(CustomPaginator, self).__init__(*args, **kwargs)
def page_num_range(self):
#總頁數(shù)小于實(shí)際展示頁
if self.num_pages < self.per_pager_num:
return range(1,self.num_pages+1)
#part 當(dāng)前總展示欄中間點(diǎn)5
part = int(self.per_pager_num//2)
#最小頁數(shù)為1防止出現(xiàn)負(fù)數(shù)情況
if self.current_page <= part:
return range(1,self.per_pager_num+1)
#最大頁數(shù)為實(shí)際總頁數(shù)
if(self.current_page+part)>self.num_pages:
return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1)
跟上面的變動(dòng)的位置
以后自定制是要調(diào)用我們寫的函數(shù)
paginator = CustomPaginator(11,current_page,USER_LIST,10)
其中11是底欄最多展示條數(shù) 恰力,'current_page'當(dāng)前頁
-
前端顯示
{% for i in posts.paginator.page_num_range%}
{% if i == posts.number %}
<a style="font-size: 30px" href="index1/?page={{ i }}">{{ i }}</a>
{% else %}
<a href="/index1/?page={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}