python shell模式下導(dǎo)入django下的Paginator模塊
In [1]: from django.core.paginator import Paginator
python shell模式下導(dǎo)入需要展示的頁面類
In [2]: from students.models import Student
python shell模式下拿到數(shù)據(jù)并進(jìn)行展示
#拿到數(shù)據(jù)以倒敘進(jìn)行展示,每頁展示3條
In [3]: p = Paginator(Student.objects.all().order_by('c_time'),3)
在python shell模式下模式下查看
In [4]: p.count #查看總數(shù)
Out[5]: 9
In [6]: p.num_pages #查看總數(shù)據(jù)可以分為幾頁
Out[7]: 3
In [8]: p.page_range #范圍
Out[9]: range(1, 4)
In [10]: pag1.object_list #查看第一頁數(shù)據(jù)
Out[11]: <QuerySet [<Student: Aaron-23>, <Student: Bleak-23>, <Student: Rose-29>]>
In [15]: pag1.has_previous() #驗(yàn)證第一頁是否有上一頁
Out[15]: False
In [16]: pag1.has_next() #驗(yàn)證第一頁是否有下一頁
Out[16]: True
編寫視圖
def student_list(request):
#分頁
#數(shù)據(jù)總量
total_num = sts.count()
#每頁的數(shù)據(jù)條數(shù)
per_page = request.GET.get('per_page',10) #10為默認(rèn)值,每頁數(shù)據(jù)條數(shù)
#當(dāng)前頁碼
page = request.GET.get('page',1)
paginator = Paginator(sts,per_page)#每頁顯示的人數(shù)
sts = paginator.get_page(page) #顯示是哪一頁
total_page = paginator.num_pages #總頁面
return render(request,'students/student_list.html',context={
"per_page" : per_page,
"total_page" : total_page,
"page" : page,
})
編寫頁面
<div class="btn-group">
<nav aria-label="Page navigation">
{% pagination_html %}
</nav>
</div>
<!-- Single button -->
<div class="btn-group" style="margin-top: -5px">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ per_page }}條/頁 <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="{{ request.path }}?per_page=3">3條/頁</a></li>
<li><a href="{{ request.path }}?per_page=5#">5條/頁</a></li>
<li><a href="{{ request.path }}?per_page=10">10條/頁</a></li>
</ul>
</div>
注冊
from django import template
register = template.Library()
@register.inclusion_tag('students/pagination.html',takes_context=True)
def pagination_html(context):
total_page = context['total_page']#總頁碼數(shù)
page = int(context['page']) #當(dāng)前頁
num = 1 #左右各顯示幾頁
page_list = []
"""
第一部分:當(dāng)前頁+左邊頁碼范圍
1瞭吃、當(dāng)前頁左邊不夠顯示,范圍就是1-當(dāng)前頁
2、當(dāng)前頁左邊可以顯示癣籽,范圍就是page-num到當(dāng)前頁
第二部分:右邊頁碼范圍
1磨取、當(dāng)前頁右邊不夠顯示,范圍就是當(dāng)前頁+1-->total_page
2情萤、當(dāng)前頁右邊可以顯示,范圍就是當(dāng)前頁+1-->page+num
"""
#第一部分:
if page - num <= 0:
for i in range(1,page+1):
page_list.append(i)
else:
for i in range(page-num,page+1):
page_list.append(i)
#第二部分:
if page + num >= total_page:
for i in range(page+1,total_page+1):
page_list.append(i)
else:
for i in range(page+1,page+num+1):
page_list.append(i)
return {"page_list" : page_list,
"page" : page,
"per_page" : context['per_page'],
"total_page" : total_page,
}
自定義模板
<ul class="pagination">
<li {% if page == 1 %}class="disabled" {% endif %}>
<a href="{% if page > 1 %}{{ request.path }}?page={{ page|add:'-1' }}&per_page={{ per_page }}{% endif %}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% for page_num in page_list %}
<li {%if page_num == page %}class="active" {% endif %}><a href="{{ request.path }}?page={{ page_num }}&per_page={{ per_page }}">{{ page_num }}</a></li>
{% endfor %}
<li {% if page == total_page %}class="disabled" {% endif %}>
<a href="{% if page < total_page %}{{ request.path }}?page={{ page|add:'1' }}&per_page={{ per_page }}{% endif %}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
效果展示