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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值