最近做网络相关舆情分析需要分页,就查看了很多的相关资料,最后发现其实,已经有现成的分页中间件可以直接使用,相当方便。本次就介绍一些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。