1. 程式人生 > >Django分頁中介軟體dj-pagination的使用,並修改pagination.html模板

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個步驟(不包括安裝,安裝中介紹了安裝)

  1. INSTALLED_APPS設定檔案的部分中列出此應用程式。Django中的setting中修改:

    INSTALLED_APPS = (
        # ...
        'dj_pagination',
    )
    
  2. 安裝分頁中介軟體。Django中的setting修改:

    MIDDLEWARE = (
        # ...
        'dj_pagination.middleware.PaginationMiddleware',
    )
    
  3. 如果尚未在您的設定中新增,請新增請求上下文處理器。請注意,預設情況下會預設設定上下文處理器,一般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"]
    
  4. 在模板頁面的頂部新增此行以載入分頁標記:

    {% load pagination_tags %}
    
  5. 確定要分頁的變數,並在迭代之前對該變數使用autopaginate標記。這可以採用兩種形式之一(使用規範object_list

    作為示例變數)預設每頁20個數據,可自行更改:

    {% autopaginate object_list %}
    
    這假定您希望每頁具有預設的20個結果。如果您想為每頁指定自己的結果數量,可以這樣指定:
    {% autopaginate object_list 10 %}
    請注意,這將替換object_list為當前頁面的列表,因此您可以object_list像往常一樣迭代。
  6. 如果使用模板標記,則autopaginate標記必須存在於訪問分頁的位置 。{% block %}{% block %}object_list

    通常,完整語法是:

    autopaginate QUERYSET [PAGINATE_BY] [ORPHANS] [as NAME]
    
  7. 現在您要顯示當前頁面和可用頁面,所以在使用autopaginate之後的某個地方,使用paginate包含標記:

    {% paginate %}
    

    這不需要任何引數,但假設您已經呼叫了autopaginate,所以請務必先執行此操作。您現在已經分頁object_list併為網站使用者提供了在不同頁面之間導航的方法 - 所有這些都無需更改檢視。

  8. 導航模板的修改

              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字首; 預設值是&lsaquo;&lsaquo;

PAGINATION_NEXT_LINK_DECORATOR

用於下一頁連結的HTML字尾; 預設值是&rsaquo;&rsaquo;

PAGINATION_DISPLAY_DISABLED_PREVIOUS_LINK

如果設定為False,如果沒有上一頁,則不會顯示上一頁連結。預設為False。

PAGINATION_DISPLAY_DISABLED_NEXT_LINK

如果設定為False,如果沒有下一頁,則不會顯示下一頁連結。預設為False。

PAGINATION_DISABLE_LINK_FOR_FIRST_PAGE

如果設定為False,則第一頁將?page=1顯示分頁中的連結字尾,否則將被省略。預設為True。