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
高級(jí)分頁(yè)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)把兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓮顽,你說(shuō)我怎么就攤上這事县好。” “怎么了暖混?”我有些...
- 文/不壞的土叔 我叫張陵缕贡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拣播,道長(zhǎng)晾咪,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任贮配,我火速辦了婚禮谍倦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泪勒。我一直安慰自己昼蛀,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布酣藻。 她就那樣靜靜地躺著曹洽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辽剧。 梳的紋絲不亂的頭發(fā)上送淆,一...
- 那天,我揣著相機(jī)與錄音怕轿,去河邊找鬼偷崩。 笑死辟拷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阐斜。 我是一名探鬼主播衫冻,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谒出!你這毒婦竟也來(lái)了隅俘?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笤喳,失蹤者是張志新(化名)和其女友劉穎为居,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體杀狡,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒙畴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呜象。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳凝。...
- 正文 年R本政府宣布祟绊,位于F島的核電站,受9級(jí)特大地震影響哥捕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘉熊,卻給世界環(huán)境...
- 文/蒙蒙 一遥赚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阐肤,春花似錦凫佛、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至衫画,卻和暖如春毫炉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背削罩。 一陣腳步聲響...
- 正文 我出身青樓进陡,卻偏偏與公主長(zhǎng)得像愿阐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趾疚,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 后臺(tái)功能的實(shí)現(xiàn): 1.創(chuàng)建員工表:t_employee2.根據(jù)表結(jié)構(gòu)創(chuàng)建實(shí)體類:Employee3.定義DAO接口...
- 分頁(yè) Django提供了一些類實(shí)現(xiàn)管理數(shù)據(jù)分頁(yè)糙麦,這些類位于django/core/paginator.py中 Pa...
- 很多站長(zhǎng)和編輯有時(shí)候就會(huì)糾結(jié)在要不要進(jìn)行分頁(yè)這件事情上喳资。分頁(yè)的優(yōu)缺點(diǎn)大家心里都模模糊糊的有些感受觉吭,可是究竟都有哪些...
- 閑著無(wú)聊鲜滩,開(kāi)發(fā)個(gè)分頁(yè)切換腳本,如有問(wèn)題节值,請(qǐng)?jiān)谠u(píng)論下指出 頁(yè)面HTML代碼 參數(shù)說(shuō)明 curPage 當(dāng)前頁(yè)碼徙硅,不...
- 一、自定義分頁(yè)遵守的 當(dāng)前頁(yè)搞疗,當(dāng)前頁(yè)可能會(huì)被傳入特別的值建議異常就是第一頁(yè) 底欄展示頁(yè)碼 數(shù)據(jù)總個(gè)數(shù)用來(lái)計(jì)算生成多...