准备工作
先在models中建一个Engineer类,插入一些数据。
起步
分页器对象的方法
方法 | 描述 |
page |
返回一个Page对象 |
count |
返回对象列表(数据)的长度 |
num_pages |
返回总页数 |
page_range |
返回页码列表 |
Page对象的方法
方法 |
描述 |
has_next |
是否有下一页 |
has_previous |
是否有上一页 |
has_other_pages |
是否有上一页或下一页 |
next_page_number |
返回下一页的页码 |
previous_page_number |
返回上一页的页码 |
start_index |
返回当前页起始的对象序号 |
end_index |
返回当前页结束的对象序号 |
views函数中的写法
from django.core.paginator import Paginator
def get_data(req,num):
# 解析参数
page_num = num
# 查出所有数据
data = Engineer.objects.all()
# 实例化分页器
paginator = Paginator(data,PER_PAGE)
# 通过传过来的页码,获得page对象
page = None
try:
page = paginator.page(page_num)
# 读取page对象数据,返回给前端
result = page.object_list
except:
result = []
res = {
'data': result,
'page_range': paginator.page_range,
'page':page,
'page_count':paginator.num_pages,
}
return render(req,'data.html',res)
url中的路由配置
from django.conf.urls import url
from app import views
urlpatterns = [
url(r"^get_data/(d+)",views.get_data),
]
前端页面写法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.1.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<ul>
{% for i in data %}
<li>{{ i.name }}的年纪是{{ i.age }}</li>
{% empty %}
<h1>没有数据了</h1>
{% endfor %}
</ul>
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
{% if page.has_previous %}
<a href="/app/get_data/{{page.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
{% else %}
<a href="/app/get_data/1" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
{% endif %}
</li>
{% for p in page_range %}
<li><a href="/app/get_data/{{ p }}">{{ p }}</a></li>
{% endfor %}
<li>
{% if page.has_next %}
<a href="/app/get_data/{{ page.next_page_number }}" aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
{% else %}
<a href="/app/get_data/{{ page_count }}" aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
{% endif %}
</li>
</ul>
</nav>
</body>
</html>