最近做網絡相關輿情分析需要分頁,就查看了很多的相關資料,最後發現其實,已經有現成的分頁中間件可以直接使用,相當方便。本次就介紹一些dj-pagination的相關知識。
具體的請參考官網:https://dj-pagination.readthedocs.io/en/latest/usage.html
首先是安裝,需要Django的版本在1.8以上:
pip install dj-pagination
dj-pagination
允許在不修改視圖的情況下輕鬆進行基於HTML的分頁。
設置項目實際上有5個步驟(不包括安裝,安裝中介紹了安裝)。
-
在
INSTALLED_APPS
設置文件的部分中列出此應用程序。Django中的setting中修改:INSTALLED_APPS = ( # ... 'dj_pagination', )
-
安裝分頁中間件。Django中的setting修改:
MIDDLEWARE = ( # ... 'dj_pagination.middleware.PaginationMiddleware', )
-
如果尚未在您的設置中添加,請添加請求上下文處理器。請注意,默認情況下會默認設置上下文處理器,一般Django 的setting中並沒有TEMPLATE_CONTEXT_PROCESSORS,需要自己添加:
TEMPLATE_CONTEXT_PROCESSORS=["django.core.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.request"]
-
在模板頁面的頂部添加此行以加載分頁標記:
{% load pagination_tags %}
-
確定要分頁的變量,並在迭代之前對該變量使用autopaginate標記。這可以採用兩種形式之一(使用規範
object_list
作爲示例變量)默認每頁20個數據,可自行更改:{% autopaginate object_list %} 這假定您希望每頁具有默認的20個結果。如果您想爲每頁指定自己的結果數量,可以這樣指定: {% autopaginate object_list 10 %} 請注意,這將替換object_list爲當前頁面的列表,因此您可以object_list像往常一樣迭代。
-
如果使用模板標記,則autopaginate標記必須存在於訪問分頁的位置 。
{% block %}
{% block %}
object_list
通常,完整語法是:
autopaginate QUERYSET [PAGINATE_BY] [ORPHANS] [as NAME]
-
現在您要顯示當前頁面和可用頁面,所以在使用autopaginate之後的某個地方,使用paginate包含標記:
{% paginate %}
這不需要任何參數,但假設您已經調用了autopaginate,所以請務必先執行此操作。您現在已經分頁
object_list
併爲網站用戶提供了在不同頁面之間導航的方法 - 所有這些都無需更改視圖。 -
導航模板的修改
Django自帶的模板很醜陋,只有分頁的作用,我在前人修改的基礎上,又進行了二次修改,更加美觀和具有實用性。模板的位置在一般在:Lib\site-packages\dj_pagination\templates\pagination目錄下。
確保網頁模板在的<head>中添加了以下代碼,這是使用了Boostrap模板:
<link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" >
<script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
對於pagination.html修改爲如下代碼:
{% if is_paginated %}
{% load i18n %}
<nav aria-label="Page navigation example" class="col-md-8 col-md-offset-3">
<ul class="pagination">
{% block previouslink %}
{% if page_obj.has_previous %}
{% if disable_link_for_first_page and page_obj.previous_page_number == 1 %}
<li class="page-item"><a href="{{ request.path }}{% if getvars %}?{{ getvars|slice:"1:" }}{% endif %}" class="prev page-link">{{ previous_link_decorator|safe }}{% trans "" %}</a></li>
{% else %}
<li class="page-item"><a href="?page{{ page_suffix }}={{ page_obj.previous_page_number }}{{ getvars }}" class="prev page-link">{{ previous_link_decorator|safe }}{% trans "" %}</a></li>
{% endif %}
{% else %}
{% if display_disabled_previous_link %}
<li class="page-item"><span class="disabled prev page-link">{{ previous_link_decorator|safe }}{% trans "previous" %}</span></li>
{% endif %}
{% endif %}
{% endblock previouslink %}
{% block pagelinks %}
{% if display_page_links %}
{% for page in pages %}
{% if page %}
{% ifequal page page_obj.number %}
<li class="page-item active"><a class="current page page-link ">{{ page }}<span class="sr-only">(current)</span></a></li>
{% else %}
{% if disable_link_for_first_page and page == 1 %}
<li class="page-item"><a href="{{ request.path }}{% if getvars %}?{{ getvars|slice:"1:" }}{% endif %}" class="page page-link">{{ page }}</a></li>
{% else %}
<li class="page-item"><a href="?page{{ page_suffix }}={{ page }}{{ getvars }}" class="page page-link">{{ page }}</a></li>
{% endif %}
{% endifequal %}
{% else %}
<li class="page-item"><a class="page page-link">...</a></li>
{% endif %}
{% endfor %}
{% endif %}
{% endblock pagelinks %}
{% block nextlink %}
{% if page_obj.has_next %}
<li class="page-item"><a href="?page{{ page_suffix }}={{ page_obj.next_page_number }}{{ getvars }}" class="next page-link">{% trans "" %}{{ next_link_decorator|safe }}</a></li>
{% else %}
{% if display_disabled_next_link %}
<li class="page-item"><span class="disabled next page-link">{% trans "" %}{{ next_link_decorator|safe }}</span></li>
{% endif %}
{% endif %}
{% endblock nextlink %}
</ul>
</nav>
{% endif %}
修改後的效果如下:
是不是美觀了很多!
最後是dj-pagination中setting中的可選事項修改,位置在Lib\site-packages\dj_pagination
在dj-pagination中,沒有必需的設置。但是,有一小組可選設置可用於更改分頁標記的默認行爲。這是一個概述:
PAGINATION_DEFAULT_PAGINATION
如果未指定編號,則在頁面上顯示的默認項目數。默認爲20
PAGINATION_DEFAULT_WINDOW
要顯示的當前頁面左側和右側的項目數(佔省略號)。默認爲4。#感覺改爲2或3的效果會更好一點
PAGINATION_DEFAULT_MARGIN
FIXME:這需要記錄在案。
PAGINATION_DEFAULT_ORPHANS
被定義爲“最後一頁允許的最小項目數,默認爲零”。
PAGINATION_INVALID_PAGE_RAISES_404
確定無效頁面是否引發Http404
或僅設置 invalid_page
上下文變量。 True
是前者還是False
後者。默認爲False
PAGINATION_DISPLAY_PAGE_LINKS
如果設置爲False
,則不會顯示單個頁面的鏈接。默認爲True。
PAGINATION_PREVIOUS_LINK_DECORATOR
上一頁鏈接的HTML前綴; 默認值是‹‹
。
PAGINATION_NEXT_LINK_DECORATOR
用於下一頁鏈接的HTML後綴; 默認值是››
。
PAGINATION_DISPLAY_DISABLED_PREVIOUS_LINK
如果設置爲False
,如果沒有上一頁,則不會顯示上一頁鏈接。默認爲False。
PAGINATION_DISPLAY_DISABLED_NEXT_LINK
如果設置爲False
,如果沒有下一頁,則不會顯示下一頁鏈接。默認爲False。
PAGINATION_DISABLE_LINK_FOR_FIRST_PAGE
如果設置爲False
,則第一頁將?page=1
顯示分頁中的鏈接後綴,否則將被省略。默認爲True。