django项目中django_pure_pagination实现分页的高级用法

先看最终实现结果:

实现步骤:

1. 安装

pip install django-pure-pagination

2. 在settings.py中增加如下配置

INSTALLED_APPS = (
    ...
    'pure_pagination',
)

3. 在settings中加入一些分页配置

PAGINATION_SETTINGS = {
    'PAGE_RANGE_DISPLAYED': 5,  # 同一方向最多显示几个
    'MARGIN_PAGES_DISPLAYED': 2,  # 省略号前后有几个

    'SHOW_FIRST_PAGE_WHEN_INVALID': True,
}

4. views.py中的代码

from pure_pagination import Paginator, PageNotAnInteger


def index(request):
    try:
        page = request.GET.get('page', 1)
    except PageNotAnInteger:
        page = 1

    objects = ['john', 'edward', 'josh', 'frank', 'john', 'edward', 'josh', 'frank',
               'john', 'edward', 'josh', 'frank', 'john', 'edward', 'josh', 'frank',
               'john', 'edward', 'josh', 'frank', 'john', 'edward', 'josh', 'frank',
               'john', 'edward', 'josh', 'frank', 'john', 'edward', 'josh', 'frank'
               ]
    # 这个地方可以换成查询数据库的记录。

    p = Paginator(objects, 1, request=request)
    # 这里的数字5是每页显示的记录条数,官方例子没加这个参数,但是不加会报错。
    page_obj = p.page(page)
    # page_obj.object_list就可以返回当前页的所有对象
    return render(request, "index.html", {"page_obj": page_obj})

5. index.html中的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% load i18n %}
<div class="pagination">
    {% if page_obj.has_previous %}
        <a href="?{{ page_obj.previous_page_number.querystring }}" class="prev">&lsaquo;&lsaquo; {% trans "previous" %}</a>
    {% else %}
        <span class="disabled prev">&lsaquo;&lsaquo; {% trans "previous" %}</span>
    {% endif %}
    {% for page in page_obj.pages %}
        {% if page %}
            {% ifequal page page_obj.number %}
                <span class="current page">{{ page }}</span>
            {% else %}
                <a href="?{{ page.querystring }}" class="page">{{ page }}</a>
            {% endifequal %}
        {% else %}
            ...
        {% endif %}
    {% endfor %}
    {% if page_obj.has_next %}
        <a href="?{{ page_obj.next_page_number.querystring }}" class="next">{% trans "next" %} &rsaquo;&rsaquo;</a>
    {% else %}
        <span class="disabled next">{% trans "next" %} &rsaquo;&rsaquo;</span>
    {% endif %}
</div>
</body>
</html>

6. 结果如图所示

7. 虽然实现了分页功能,但是太丑陋,我们结合bootstrap来美化分页功能

(1)views.py中的代码不变

(2)index.html中的代码需要发生变化,如下

<!DOCTYPE html>
<html lang="en">
{% load static %}
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
    <script src="{% static 'js/bootstrap.js' %}"></script>
</head>
<body>
{% load i18n %}

    <nav>
        <ul class="pagination{% if size %} pagination-{{ size }}{% endif %}">
            {% if page_obj.has_previous %}
                <li class="previous">
                    <a href="?{{ page_obj.previous_page_number.querystring }}" aria-label="{% trans 'previous page' %}">
                        <span aria-hidden="true">&laquo;</span>
                        {% if verbose %}<span class="hidden-xs">{% trans 'previous page' %}</span>{% endif %}
                    </a>
                </li>
            {% else %}
                <li class="previous disabled">
                    <span>
                        <span aria-hidden="true">&laquo;</span>
                        {% if verbose %}<span class="hidden-xs">{% trans 'previous page' %}</span>{% endif %}
                    </span>
                </li>
            {% endif %}

            {% for page in page_obj.pages %}
                {% if page %}
                    {% ifequal page page_obj.number %}
                        <li class="active">
                            <a href="?{{ page.querystring }}">{{ page }} <span class="sr-only">({% trans 'current page' %})</span></a>
                        </li>
                    {% else %}
                        <li>
                            <a href="?{{ page.querystring }}">{{ page }}</a>
                        </li>
                    {% endifequal %}
                {% else %}
                    <li class="disabled">
                        <span>...</span>
                    </li>
                {% endif %}
            {% endfor %}

            {% if page_obj.has_next %}
                <li class="next">
                    <a href="?{{ page_obj.next_page_number.querystring }}" aria-label="{% trans 'next page' %}">
                        {% if verbose %}<span class="hidden-xs">{% trans 'next page' %}</span>{% endif %}
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
            {% else %}
                <li class="next disabled">
                    <span>
                        {% if verbose %}<span class="hidden-xs">{% trans 'next page' %}</span>{% endif %}
                        <span aria-hidden="true">&raquo;</span>
                    </span>
                </li>
            {% endif %}
        </ul>
    </nav>

</body>
</html>

8. 最终,通过bootstrap美化后的分页如图所示,是不感觉还不错,哈哈哈,动手快试试吧!

9. page对象的常用属性与方法

#是否有前一页

page.has_previous
#是否有下一页

page.has_next
#前一页的页码

page.previous_page_number.querystring
#下一页的页码

page.next_page_number_querystring
#当前页

page.number
#当前页页码

page.querystring

#如果a=b
{% ifequal a b %}
{% endifequal %}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专职

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值