Django實現基於類的分頁功能

開發個人博客時往往避免不了分頁功能的實現,實現方法大體上分爲函數和類兩種。本文基於類實現分頁功能,以下是詳細代碼:

class Page:
    page_num = 0
    total_count = 0
    tartype = ""
    total_page = 0  # 總頁數
    per_page = 8  # 每頁顯示8篇文章
    max_page = 11  # 每頁最大展示頁數選項
    half_page = max_page // 2
    category = ""  # 標記該鏈接所屬分類ID,首頁默認爲空

    def __init__(self, page_num, total_count, tartype, category):
        """
        初始化函數:接收頁碼數、總數據數,計算總頁碼數並過濾錯誤頁碼數據
        :param page_num: 頁碼數
        :param total_count: 總數據數
        :param tartype: 分類值
        :param category: 所屬分類ID
        """
        self.page_num = page_num
        self.total_count = total_count
        self.tartype = tartype
        self.total_page, m = divmod(self.total_count, self.per_page)  # 總頁碼數,餘數爲m
        if category:
            self.category = category
        if m:
            self.total_page += 1
        if self.total_page < self.max_page:
            self.max_page = self.total_page
            self.half_page = self.max_page // 2
        # 過濾錯誤get數據
        if self.page_num > self.total_page:
            self.page_num = self.total_page
        elif self.page_num < 1:
            self.page_num = 1

    def data_start(self):
        return (self.page_num - 1) * self.per_page

    def data_end(self):
        return self.page_num * self.per_page

    def page_html(self):
        # 計算頁數選項
        page_start = self.page_num - self.half_page
        page_end = self.page_num + self.half_page
        if page_start <= 1:
            page_start = 1
            page_end = self.max_page
        if page_end >= self.total_page:
            page_end = self.total_page
            page_start = self.total_page - self.max_page + 1
        # 計算上一頁下一頁選項
        if self.page_num == 1:
            last_page = self.page_num
            next_page = self.page_num + 1
        else:
            if self.page_num == self.total_page:
                last_page = self.page_num - 1
                next_page = self.page_num
            else:
                last_page = self.page_num - 1
                next_page = self.page_num + 1
        print(self.category)
        html_str_list = []
        html_str_list.append('<li><a href="/{}/?page={}{}">«</a></li>'.format(self.tartype, last_page, self.category))
        for i in range(page_start, page_end + 1):
            if i == self.page_num:
                tmp = '<li><a class="active" href="/{}/?page={}{}">{}</a></li>'.format(self.tartype, i, self.category, i)
                html_str_list.append(tmp)
                continue
            tmp = '<li><a href="/{}/?page={}{}">{}</a></li>'.format(self.tartype, i, self.category, i)
            html_str_list.append(tmp)
        html_str_list.append('<li><a href="/{}/?page={}{}">»</a></li>'.format(self.tartype, next_page, self.category))
        page_html = "".join(html_str_list)
        return page_html

通過修改per_page、max_page控制每頁展示的文章數和分頁模塊展示的最大頁碼數。
實現思路:創建page類對象,傳入參數爲page_num(當前頁碼數)、total_count(總文章數)、tartype(分類值)、category(所屬分類ID)【注:tartpe用於區分index頁還是category頁,category爲查詢的分類ID,index頁時值爲空。可以根據自己要實現的功能進行修改】構造函數會計算出總頁碼數並過濾掉錯誤數據。需要實現某功能是直接調用類方法即可。
類方法:data_start()計算出當前頁的文章的起始索引值
data_end()計算出當前頁的文章的起始索引值
page_html()返回分頁模塊的html代碼,可直接render到前端。
實現效果:
文章較少時:
在這裏插入圖片描述
文章較多時:
在這裏插入圖片描述
原文地址: https://www.jhxblog.cn/article/?articleid=5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章