django提供了分页的工具,存在于django.core中

Paginator : 数据分页工具

Page : 具体的某一页面

Paginator

对象创建

Paginator(数据集,每一页数据数)

属性

  • count: 对象总数
  • num_pages: 页面总数
  • page_range: 页码列表,从1开始

方法

page(整数): 获得一个page对象

常见错误

  • InvalidPage:page() 传递无效页码
  • PageNotAnInteger:page() 传递的不是整数
  • Empty:page() 传递的值有效,但是没有数据

Page

对象获得,通过Paginator的page()方法获得

属性

  • object_list: 当前页面上所有的数据对象
  • number: 当前页的页码值
  • paginator: 当前page关联的Paginator对象

方法

  • has_next() :判断是否有下一页
  • has_previous():判断是否有上一页
  • has_other_pages():判断是否有上一页或下一页
  • next_page_number():返回下一页的页码
  • previous_page_number():返回上一页的页码
  • len():返回当前页的数据的个数

8NTSC6.png

实例

1
2
3
4
5
6
7
8
9
10
11
def get_students.with_page( request):
page = int(request.GET.get("page", 1))
per_page =int(request.GET.get("per. page", 10))
students = Student.objects.all()
paginator = Paginator(students, per_page)
page_object = paginator.page(page)
data = {
"page_object": page_object
}
return render( request, ' students_with_page.html',context=data)

一个带分页界面的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>StudentsWithPage</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.11.1/jquery.js"></script>
<script type="text/javascript" src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.js"></script>

</head>
<body>

<ul>
{% for student in page_object.object_list %}
<li>{{ student.s_name }}</li>
{% endfor %}

</ul>


<nav aria-label="Page navigation">
<ul class="pagination">
{% if page_object.has_previous %}
<li>
<a href="{% url 'app:get_students_with_page' %}?page={{ page_object.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>

{% endif %}

{% for page_index in page_range %}
{% ifequal page_index page_object.number %}
<li class="active"><a href="{% url 'app:get_students_with_page' %}?page={{ page_index }}">{{ page_index }}</a></li>
{% else %}
<li><a href="{% url 'app:get_students_with_page' %}?page={{ page_index }}">{{ page_index }}</a></li>
{% endifequal %}

{% endfor %}

{% if page_object.has_next %}
<li>
<a href="{% url 'app:get_students_with_page' %}?page={{ page_object.next_page_number }}" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
{% endif %}

</ul>
</nav>

</body>
</html>

思维导图

8N5rVI.png