Django分頁中介軟體dj-pagination的使用,並修改pagination.html模板
最近做網路相關輿情分析需要分頁,就查看了很多的相關資料,最後發現其實,已經有現成的分頁中介軟體可以直接使用,相當方便。本次就介紹一些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
{% 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。