高級(jí)分頁(yè)

class IndexView(ListView):
    model = Post
    template_name = 'blog/index.html'
    context_object_name = 'post_list'
    paginate_by = 10

    def get_context_data(self, **kwargs):
        """
        在視圖函數(shù)中將模板變量傳遞給模板是通過(guò)給 render 函數(shù)的 context 參數(shù)傳遞一個(gè)字典實(shí)現(xiàn)的拦赠,
        例如 render(request, 'blog/index.html', context={'post_list': post_list}),
        這里傳遞了一個(gè) {'post_list': post_list} 字典給模板葵姥。
        在類視圖中荷鼠,這個(gè)需要傳遞的模板變量字典是通過(guò) get_context_data 獲得的,
        所以我們復(fù)寫(xiě)該方法榔幸,以便我們能夠自己再插入一些我們自定義的模板變量進(jìn)去允乐。
        """

        # 首先獲得父類生成的傳遞給模板的字典。
        context = super().get_context_data(**kwargs)

        # 父類生成的字典中已有 paginator削咆、page_obj牍疏、is_paginated 這三個(gè)模板變量,
        # paginator 是 Paginator 的一個(gè)實(shí)例拨齐,
        # page_obj 是 Page 的一個(gè)實(shí)例鳞陨,
        # is_paginated 是一個(gè)布爾變量,用于指示是否已分頁(yè)瞻惋。
        # 例如如果規(guī)定每頁(yè) 10 個(gè)數(shù)據(jù)厦滤,而本身只有 5 個(gè)數(shù)據(jù),其實(shí)就用不著分頁(yè)熟史,此時(shí) is_paginated=False馁害。
        # 關(guān)于什么是 Paginator,Page 類在 Django Pagination 簡(jiǎn)單分頁(yè):http://zmrenwu.com/post/34/ 中已有詳細(xì)說(shuō)明蹂匹。
        # 由于 context 是一個(gè)字典碘菜,所以調(diào)用 get 方法從中取出某個(gè)鍵對(duì)應(yīng)的值。
        paginator = context.get('paginator')
        page = context.get('page_obj')
        is_paginated = context.get('is_paginated')

        # 調(diào)用自己寫(xiě)的 pagination_data 方法獲得顯示分頁(yè)導(dǎo)航條需要的數(shù)據(jù)限寞,見(jiàn)下方忍啸。
        pagination_data = self.pagination_data(paginator, page, is_paginated)

        # 將分頁(yè)導(dǎo)航條的模板變量更新到 context 中,注意 pagination_data 方法返回的也是一個(gè)字典履植。
        context.update(pagination_data)

        # 將更新后的 context 返回计雌,以便 ListView 使用這個(gè)字典中的模板變量去渲染模板。
        # 注意此時(shí) context 字典中已有了顯示分頁(yè)導(dǎo)航條所需的數(shù)據(jù)玫霎。
        return context

    def pagination_data(self, paginator, page, is_paginated):
        if not is_paginated:
            # 如果沒(méi)有分頁(yè)凿滤,則無(wú)需顯示分頁(yè)導(dǎo)航條妈橄,不用任何分頁(yè)導(dǎo)航條的數(shù)據(jù),因此返回一個(gè)空的字典
            return {}

        # 當(dāng)前頁(yè)左邊連續(xù)的頁(yè)碼號(hào)翁脆,初始值為空
        left = []

        # 當(dāng)前頁(yè)右邊連續(xù)的頁(yè)碼號(hào)眷蚓,初始值為空
        right = []

        # 標(biāo)示第 1 頁(yè)頁(yè)碼后是否需要顯示省略號(hào)
        left_has_more = False

        # 標(biāo)示最后一頁(yè)頁(yè)碼前是否需要顯示省略號(hào)
        right_has_more = False

        # 標(biāo)示是否需要顯示第 1 頁(yè)的頁(yè)碼號(hào)。
        # 因?yàn)槿绻?dāng)前頁(yè)左邊的連續(xù)頁(yè)碼號(hào)中已經(jīng)含有第 1 頁(yè)的頁(yè)碼號(hào)反番,此時(shí)就無(wú)需再顯示第 1 頁(yè)的頁(yè)碼號(hào)沙热,
        # 其它情況下第一頁(yè)的頁(yè)碼是始終需要顯示的。
        # 初始值為 False
        first = False

        # 標(biāo)示是否需要顯示最后一頁(yè)的頁(yè)碼號(hào)罢缸。
        # 需要此指示變量的理由和上面相同篙贸。
        last = False

        # 獲得用戶當(dāng)前請(qǐng)求的頁(yè)碼號(hào)
        page_number = page.number

        # 獲得分頁(yè)后的總頁(yè)數(shù)
        total_pages = paginator.num_pages

        # 獲得整個(gè)分頁(yè)頁(yè)碼列表,比如分了四頁(yè)枫疆,那么就是 [1, 2, 3, 4]
        page_range = paginator.page_range

        if page_number == 1:
            # 如果用戶請(qǐng)求的是第一頁(yè)的數(shù)據(jù)爵川,那么當(dāng)前頁(yè)左邊的不需要數(shù)據(jù),因此 left=[](已默認(rèn)為空)养铸。
            # 此時(shí)只要獲取當(dāng)前頁(yè)右邊的連續(xù)頁(yè)碼號(hào)雁芙,
            # 比如分頁(yè)頁(yè)碼列表是 [1, 2, 3, 4],那么獲取的就是 right = [2, 3]钞螟。
            # 注意這里只獲取了當(dāng)前頁(yè)碼后連續(xù)兩個(gè)頁(yè)碼,你可以更改這個(gè)數(shù)字以獲取更多頁(yè)碼谎碍。
            right = page_range[page_number:page_number + 2]

            # 如果最右邊的頁(yè)碼號(hào)比最后一頁(yè)的頁(yè)碼號(hào)減去 1 還要小鳞滨,
            # 說(shuō)明最右邊的頁(yè)碼號(hào)和最后一頁(yè)的頁(yè)碼號(hào)之間還有其它頁(yè)碼,因此需要顯示省略號(hào)蟆淀,通過(guò) right_has_more 來(lái)指示拯啦。
            if right[-1] < total_pages - 1:
                right_has_more = True

            # 如果最右邊的頁(yè)碼號(hào)比最后一頁(yè)的頁(yè)碼號(hào)小,說(shuō)明當(dāng)前頁(yè)右邊的連續(xù)頁(yè)碼號(hào)中不包含最后一頁(yè)的頁(yè)碼
            # 所以需要顯示最后一頁(yè)的頁(yè)碼號(hào)熔任,通過(guò) last 來(lái)指示
            if right[-1] < total_pages:
                last = True

        elif page_number == total_pages:
            # 如果用戶請(qǐng)求的是最后一頁(yè)的數(shù)據(jù)褒链,那么當(dāng)前頁(yè)右邊就不需要數(shù)據(jù),因此 right=[](已默認(rèn)為空)疑苔,
            # 此時(shí)只要獲取當(dāng)前頁(yè)左邊的連續(xù)頁(yè)碼號(hào)甫匹。
            # 比如分頁(yè)頁(yè)碼列表是 [1, 2, 3, 4],那么獲取的就是 left = [2, 3]
            # 這里只獲取了當(dāng)前頁(yè)碼后連續(xù)兩個(gè)頁(yè)碼惦费,你可以更改這個(gè)數(shù)字以獲取更多頁(yè)碼兵迅。
            left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]

            # 如果最左邊的頁(yè)碼號(hào)比第 2 頁(yè)頁(yè)碼號(hào)還大,
            # 說(shuō)明最左邊的頁(yè)碼號(hào)和第 1 頁(yè)的頁(yè)碼號(hào)之間還有其它頁(yè)碼薪贫,因此需要顯示省略號(hào)恍箭,通過(guò) left_has_more 來(lái)指示。
            if left[0] > 2:
                left_has_more = True

            # 如果最左邊的頁(yè)碼號(hào)比第 1 頁(yè)的頁(yè)碼號(hào)大瞧省,說(shuō)明當(dāng)前頁(yè)左邊的連續(xù)頁(yè)碼號(hào)中不包含第一頁(yè)的頁(yè)碼扯夭,
            # 所以需要顯示第一頁(yè)的頁(yè)碼號(hào)鳍贾,通過(guò) first 來(lái)指示
            if left[0] > 1:
                first = True
        else:
            # 用戶請(qǐng)求的既不是最后一頁(yè),也不是第 1 頁(yè)交洗,則需要獲取當(dāng)前頁(yè)左右兩邊的連續(xù)頁(yè)碼號(hào)骑科,
            # 這里只獲取了當(dāng)前頁(yè)碼前后連續(xù)兩個(gè)頁(yè)碼,你可以更改這個(gè)數(shù)字以獲取更多頁(yè)碼藕筋。
            left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
            right = page_range[page_number:page_number + 2]

            # 是否需要顯示最后一頁(yè)和最后一頁(yè)前的省略號(hào)
            if right[-1] < total_pages - 1:
                right_has_more = True
            if right[-1] < total_pages:
                last = True

            # 是否需要顯示第 1 頁(yè)和第 1 頁(yè)后的省略號(hào)
            if left[0] > 2:
                left_has_more = True
            if left[0] > 1:
                first = True

        data = {
            'left': left,
            'right': right,
            'left_has_more': left_has_more,
            'right_has_more': right_has_more,
            'first': first,
            'last': last,
        }

        return data
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纵散,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隐圾,更是在濱河造成了極大的恐慌伍掀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暇藏,死亡現(xiàn)場(chǎng)離奇詭異蜜笤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盐碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)把兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓮顽,你說(shuō)我怎么就攤上這事县好。” “怎么了暖混?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缕贡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拣播,道長(zhǎng)晾咪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任贮配,我火速辦了婚禮谍倦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泪勒。我一直安慰自己昼蛀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布酣藻。 她就那樣靜靜地躺著曹洽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辽剧。 梳的紋絲不亂的頭發(fā)上送淆,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音怕轿,去河邊找鬼偷崩。 笑死辟拷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阐斜。 我是一名探鬼主播衫冻,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谒出!你這毒婦竟也來(lái)了隅俘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笤喳,失蹤者是張志新(化名)和其女友劉穎为居,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體杀狡,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒙畴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呜象。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳凝。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恭陡,靈堂內(nèi)的尸體忽然破棺而出蹬音,到底是詐尸還是另有隱情,我是刑警寧澤休玩,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布祟绊,位于F島的核電站,受9級(jí)特大地震影響哥捕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘉熊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一遥赚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阐肤,春花似錦凫佛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至衫画,卻和暖如春毫炉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背削罩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工瞄勾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费奸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓进陡,卻偏偏與公主長(zhǎng)得像愿阐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趾疚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容