page = Paginator(obj_list, per_page)
object_list : 一個列表,元祖或則Django 的Queryset 對象 或則其他對象帶有 count() or len()的方法
per_page :就是1頁顯示幾條數(shù)據(jù)
page對象的方法和屬性
- page .has_next() ----
如果有下一頁,則返回True。
- page .has_previous() ----
如果有上一頁,返回 True。
- page .has_other_pages()
如果有上一頁或下一頁,返回True。
- page .next_page_number()
返回下一頁的頁碼。如果下一頁不存在,拋出InvalidPage異常。
- page .previous_page_number()
返回上一頁的頁碼。如果上一頁不存在,拋出InvalidPage異常。
- page .start_index()
返回當前頁上的第一個對象,相對于分頁列表的所有對象的序號,從1開始。比如,將五個對象的列表分為每頁兩個對象,第二頁的start_index()會返回3。
- page .end_index()
返回當前頁上的最后一個對象,相對于分頁列表的所有對象的序號,從1開始。 比如,將五個對象的列表分為每頁兩個對象,第二頁的end_index() 會返回 4。
- page.number
當前頁碼
- page.paginator
相關(guān)的Paginator對象。
page.paginator對象的屬性
- per_page: 每頁顯示條目數(shù)量
- count: 數(shù)據(jù)總個數(shù)
- num_pages:總頁數(shù)
- page_range:總頁數(shù)的索引范圍,頁碼的范圍,從1開始,例如[1, 2, 3, 4]。
后端代碼
# 得到表的對象的列表,因為 Paginator 第一個參數(shù)必須是可迭代的,第二個參數(shù)是每頁展示的個數(shù)
model_all = admin_class.model.objects.all()
paginator = Paginator(model_all,1)
current_page = request.GET.get('page')
try:
# paginator.page()得到的是一頁的對象列表,所以前端不用再對
# admin_class.model.objects.all()進行循環(huán),而是循環(huán)posts
posts = paginator.page(current_page)
# 防止用戶輸入非法字符
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
前端代碼
<nav aria-label="">
<ul class="pagination">
{# 判斷posts是否有上一頁#}
{% if posts.has_previous %}
<li class=""><a href="?page=1">首頁</a></li>
<li class=""><a href="?page={{ posts.previous_page_number }}">上一頁</a></li>
{% endif %}
{# 中間顯示頁碼需要對所有的頁碼進行循環(huán) #}
{# posts.paginator得到的又是一個paginator對象,只有paginator對象才有page_range方法 #}
{% for loop_counter in posts.paginator.page_range %}
{# 簡單標簽 #}
{% loop_display_page loop_counter posts %}
{% endfor %}
{# 判斷posts是否有下一頁#}
{% if posts.has_next %}
<li class=""><a href="?page={{ posts.next_page_number }}">下一頁</a></li>
<li><a href="?page={{ posts.paginator.num_pages }}">尾頁</a></li>
{% endif %}
</ul>
</nav>
簡單標簽代碼
@register.simple_tag
def loop_display_page(loop_counter, posts):
cls =''
# 需求為只顯示當前頁碼加左右兩邊各兩個頁碼
if abs(posts.number-loop_counter)<=2:
# 如果循環(huán)到的頁碼等于當前頁碼,給頁碼加上 active 樣式
if loop_counter == posts.number:
cls = "active"
return mark_safe('<li class="%s"><a href="?page=%s">%s</a></li>'%(cls,loop_counter,loop_counter))
# 防止分頁最末尾出現(xiàn) None
return ''
分頁改良版
效果圖:

image.png
代碼如下:
@register.simple_tag
def loop_display_page(posts, filter_conditions):
fil = ''
ele = ''
flag = False
for k ,v in filter_conditions.items():
fil += '&%s=%s'%(k,v)
for page_num in posts.paginator.page_range:
# 前兩頁,后兩頁,當前頁的兩邊都顯示,其余的··表示
if page_num < 3 or page_num > posts.paginator.num_pages-2 or abs(posts.number - page_num) <=1:
cls =''
if page_num == posts.number:
flag = False
cls = 'active'
ele += '<li class="%s"><a href="?page=%s%s">%s</a></li>'%(cls,page_num,fil,page_num)
elif flag == False:
ele += '<li><a>··</a></li>'
flag = True
return mark_safe(ele)
!注意標志位的使用