先看最终实现结果:
实现步骤:
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">‹‹ {% trans "previous" %}</a>
{% else %}
<span class="disabled prev">‹‹ {% 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" %} ››</a>
{% else %}
<span class="disabled next">{% trans "next" %} ››</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">«</span>
{% if verbose %}<span class="hidden-xs">{% trans 'previous page' %}</span>{% endif %}
</a>
</li>
{% else %}
<li class="previous disabled">
<span>
<span aria-hidden="true">«</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">»</span>
</a>
</li>
{% else %}
<li class="next disabled">
<span>
{% if verbose %}<span class="hidden-xs">{% trans 'next page' %}</span>{% endif %}
<span aria-hidden="true">»</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 %}