初识Django之分页器Paginator
为什么要分页
分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。
原生方法分页
- 在urls.py里urlpatterns中添加
path('getstudents/', views.get_students, name='get_students'),
- views.py中添加get_students函数获取学生数量
1
2
3
4
5
6
7
8def get_students(request):
page = int(request.GET.get("page", 1))
per_page = int(request.GET.get("per_page", 10))
students = Student.objects.all()[per_page*(page-1): page*per_page]
data = {
"students": students
}
return render(request, 'students.html', context=data) - 通过访问
http://127.0.0.1:8001/app/getstudents/?page=2&per_page=20
可以看到分页效果
分页器Paginator
Django很贴心的为我们提供了一个Paginator分页工具。分页功能位于django.core.paginator
模块。
API
Paginator提供包含一些对象的列表,以及你想每一页显示几条,比如每页5条、10条、20条、100条等等,它就会为你提供访问的一系列API方法,示例如下:
1 | from django.core.paginator import Paginator |
实例
- 在urls.py里urlpatterns中添加
path('getstudentswithpage/', views.get_students_with_page, name='get_students_with_page')
- views.py中添加getstudentswithpage函数获取学生数量
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 分页器
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,
"page_range": paginator.page_range
}
return render(request, 'students_with_page.html', context=data) - 绘制students_with_page.html界面
包括前一页、下一页、边缘bug处理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
<html lang="en">
<head>
<meta charset="UTF-8">
<title>students_with_page</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
</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 class="page-item">
<a class="page-link"
href="{% url 'app:get_students_with_page' %}?page={{ page_object.previous_page_number }}"
aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% else %}
<li class="disabled">
<a class="page-link"
href="#"
aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% endif %}
{% for page_index in page_range %}
{% ifequal page_index page_object.number %}
<li class="active"><a class="page-link"
href="{% url 'app:get_students_with_page' %}?page={{ page_index }}">{{ page_index }}</a></li>
{% else %}
<li><a class="page-link"
href="{% url 'app:get_students_with_page' %}?page={{ page_index }}">{{ page_index }}</a></li>
{% endifequal %}
{% endfor %}
{% if page_object.has_next %}
<li class="page-item">
<a class="page-link"
href="{% url 'app:get_students_with_page' %}?page={{ page_object.next_page_number }}"
aria-label="Next">
<span aria-hidden="true">»</span>
</a>
{% else %}
<li class="disabled">
<a class="page-link" href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
{% endif %}
</ul>
</nav>
</body>
</html> - 通过访问
http://127.0.0.1:8001/app/getstudentswithpage/?page=1&per_page=10
可以如下图图看到第五页分页,
可以进行简单的前一页,下一页操作!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随心所欲录!
评论