優雅地使用django進行分頁(自定義tag)

  • 2019 年 11 月 20 日
  • 筆記

# 背景 使用django自帶的 [官方的分頁器](https://docs.djangoproject.com/en/1.11/topics/pagination/)做了一個網站,但是分頁的效果過於醜陋。只能展示上一頁、下一頁、總頁數、當前頁碼。 而大多數的網站,基本都可以一次顯示當前頁碼的臨近頁碼,以及直接跳轉到首頁、末頁、指定頁。 下面是一個理想的分頁器。

# 使用自定義tag實現分頁器 其實使用JavaScript實現一個優雅的分頁器並沒有技術難度,只是繁瑣的東西太多,尤其是當前頁在最左邊或者最右邊時。使用一個開源的實現能減少工作量。我在[這篇部落格](https://medium.com/@sumitlni/paginate-properly-please-93e7ca776432)里找到了一個理想的分頁器。 這篇部落格使用到了自定義的tag, 可能需要看下[官方教程](https://docs.djangoproject.com/en/dev/howto/custom-template-tags/) 自定義tag使用要點: 1. 使用templatetags文件夾,與view.py同級(templatetags中要有__init__.py) 2. 將view.py的父文件夾放入setting.py中的INSTALLED_APP中 3. 使用 `{% load proper_paginate %}` 對自己的tag進行載入.注意這裡應該加花括弧與百分號。 3. 重啟django # 對原始分頁器的修改 在使用中發現工作不正常,源碼中`{% for i in paginator|proper_paginate:page_obj.number %}`出錯, 可能是django版本不同造成的。我採用下述方案予以規避。 undefined 使用`with`語句在模板中定義變數,可以參考[在模板中定義變數](https://blog.csdn.net/qq_24861509/article/details/50557149) 修改後的完整的html模板如下: undefined 其他未解決問題: 1. 在`{% with temp=articles.paginator|proper_paginate:articles.number %}`中, proper_paginate至少需要2個變數,那三個變數怎麼辦?