Django自帶分頁模塊詳解

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)

!注意標志位的使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 方法一:使用pure_pagination進行分頁 1. pure_pagination介紹 pure_pagin...
    Jlan閱讀 1,195評論 0 7
  • Django 中已經(jīng)寫好了分頁實現(xiàn)的邏輯,我們在做分頁的時候,僅需要通過倆個對象Paginator 和 Page ...
    鳥它鳥閱讀 325評論 0 0
  • 我們先在 shell 中演示分頁器的用法: 分頁器示例 現(xiàn)在我們在 view 中使用分頁器: 瀏覽器打開:http...
    SingleDiego閱讀 1,685評論 2 3
  • 當頁面因需要展示的數(shù)據(jù)條目過多,導(dǎo)致無法在一個頁面全部顯示。這時,頁面經(jīng)常會采用分頁形式進行展示,然后每頁顯示 2...
    猴哥愛讀書閱讀 33,791評論 4 20
  • 1、多特征變量及其相關(guān)概念 2、多變量線性回歸,其中表達式可轉(zhuǎn)化為向量相乘,注意令x0 = 1 3、 4、單變量線...
    mugtmag閱讀 492評論 0 0

友情鏈接更多精彩內(nèi)容