Django15-分頁功能

1、在views中實現分頁功能

views.pyhtml

def depart_list(request):
    depart_all = models.Depart.objects.all()
    # 分頁 每頁最多顯示10條記錄
    obj_total = depart_all.count()
    try:
        # 若是獲取不到page參數,將page_id默認設置成1
        page_id = int(request.GET.get('page', 1))
    except Exception as e:
        page_id = 1
    # 第1頁切片,[0:10],取id爲0-9的10條記錄
    # 第2頁切片,[10:20],取id爲10-19的10條記錄
    # 第n頁切片,[(n-1)*10:n*10]
    obj_start = (page_id - 1) * 10
    obj_end = page_id * 10
    # 總頁碼數爲page_num
    page_num, more = divmod(obj_total, 10)
    if more:
        # 若是有餘數,則頁碼數加1
        page_num += 1
    # 第1頁序號從1-10,第2頁序號從11-20,而前端forloop.counter是從0開始,因此每頁序號起始值要加上(n-1)*10
    obj_id_start = (page_id - 1) * 10
    
    # 每頁的頁碼範圍
    page_start = (page_id - 1) // 10 * 10 + 1
    page_end = page_start + 10
    # 若是結束頁碼大於總頁碼,就以總頁碼數爲結尾
    if page_end > page_num:
        page_end = page_num + 1
    
    return render(request, 'depart/depart_list.html',
                  {'depart_all': depart_all[obj_start:obj_end],
                   # 'page_total': range(1, page_num + 1),  # 顯示全部的分頁頁碼
                   'page_total': range(page_start, page_end),  # 顯示頁碼範圍
                   'obj_id_start': obj_id_start,
                   })

  

user_list.html前端

{#分頁#}
<div>
    <nav aria-label="Page navigation">
        <ul class="pagination">

        {#向前翻頁連接#}
            {{ page_previous }}

            {% for num in page_total %}
                {#num等於當前頁碼時,顯示active#}
                <li {% if page_id == num %}class="active"{% endif %}><a href="?page={{ num }}">{{ num }}</a></li>
            {% endfor %}

        {#向後翻頁連接#}
            {{ page_next }}
        </ul>
    </nav>
</div> 

  

2、分頁功能封裝成類

因爲在views.py中編寫了大量分頁的功能,與核心邏輯無關,因此最好能將分頁功能單獨封裝成類,再在views中調用python

新建utils目錄中的paginate.py用於封裝分頁類django

from django.utils.safestring import mark_safe

class Paginate:
    
    def __init__(self, obj_all, page_id, obj_max=10, page_max=10):
        
        self.obj_total = obj_all.count()
	  # 分頁 每頁顯示的條目數,默認最多顯示10條記錄
	  self.obj_max = obj_max
        # 每頁最多顯示的頁碼個數
        self.page_max = page_max
        
        try:
            # 若是獲取不到page參數,將page_id默認設置成1
            self.page_id = page_id
        except Exception as e:
            self.page_id = 1
        
        # 總頁碼數爲page_num
        self.page_total, more = divmod(self.obj_total, obj_max)
        if more:
            # 若是有餘數,則頁碼數加1
            self.page_total += 1
    
    # 第1頁切片,[0:10],取id爲0-9的10條記錄
    # 第2頁切片,[10:20],取id爲10-19的10條記錄
    # 第n頁切片,[(n-1)*10:n*10]
       #經過@property將方法封裝成屬性,在調用實例化對象.方法時就不須要加括號執行
    @property
    def obj_start(self):
        obj_start = (self.page_id - 1) * self.obj_max
        return obj_start
    
    @property
    def obj_end(self):
        obj_end = self.page_id * self.obj_max
        return obj_end
    
    @property
    def obj_id_start(self):
        # 第1頁序號從1-10,第2頁序號從11-20,而前端forloop.counter是從0開始,因此每頁序號起始值要加上(n-1)*10
        obj_id_start = (self.page_id - 1) * self.page_max
        return obj_id_start
    
    @property
    def page_start(self):
        # 每頁的頁碼範圍
        page_start = (self.page_id - 1) // self.obj_max * self.page_max + 1
        return page_start
    
    @property
    def page_end(self):
        page_end = self.page_start + self.page_max
        # 若是結束頁碼大於總頁碼,就以總頁碼數爲結尾
        if page_end > self.page_total:
            page_end = self.page_total + 1
        return page_end
    
    @property
    def page_previous(self):
        # 向前翻頁,若是頁面起始值爲1,則向前翻頁連接禁用
        if self.page_start == 1:
            page_previous = '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">«</span></a></li>'
        
        else:
            page_previous = '<li><a href="?page=%s" aria-label="Previous"><span aria-hidden="true">«</span></a></li>' \
                            % (self.page_start - self.obj_max)
        return mark_safe(page_previous)
    
    @property
    def page_next(self):
        # 向後翻頁,最後一頁向後翻頁連接禁用
        if self.page_end == self.page_total + 1:
            page_next = '<li class="disabled"><a aria-label="Next"><span aria-hidden="true">»</span></a></li>'
        else:
            page_next = '<li><a href="?page=%s" aria-label="Next"><span aria-hidden="true">»</span></a></li>' \
                        % (self.page_start + self.obj_max)
        return mark_safe(page_next)

views.py文件中只須要實例化分頁類並傳參便可oop

def user_list(request):
    user_all = models.User.objects.all()
    #獲取當前頁面Url中的?page=id值,默認爲1
    page_id = int(request.GET.get('page', 1))
    #實例化分頁類
    paginate = Paginate(user_all, page_id)

    #返回參數,使用對象.參數的方法調用,因爲類中使用了@property裝飾器將方法封裝成屬性,因此不須要加括號便可執行
    return render(request, 'user/user_list.html',
                  {'user_all': user_all[paginate.obj_start:paginate.obj_end],
                   'page_total': range(paginate.page_start, paginate.page_end),  # 顯示頁碼範圍
                   'obj_id_start': paginate.obj_id_start,
                   'page_id': paginate.page_id,
                   'page_previous': paginate.page_previous,
                   'page_next': paginate.page_next,
                   })

user_list.html前端渲染spa

{#分頁#}
<div>
    <nav aria-label="Page navigation">
        <ul class="pagination">

        {#向前翻頁連接#}
            {{ page_previous }}

            {% for num in page_total %}
                {#num等於當前頁碼時,顯示active#}
                <li {% if page_id == num %}class="active"{% endif %}><a href="?page={{ num }}">{{ num }}</a></li>
            {% endfor %}

        {#向後翻頁連接#}
            {{ page_next }}
        </ul>
    </nav>
</div>
相關文章
相關標籤/搜索