本文实例讲述了Django框架实现的分页。分享给大家供大家参考,具体如下:
首先初始化model,建表
1
2
3
4
5
6
|
class Book(models.Model): name = models.CharField(max_length = 20 ) def __str__( self ): return self .name class Meta: db_table = 'books' |
然后用pycharm的数据库模块可视化插入
分页思路
url传递参数http://127.0.0.1:8000/books/?page=5比如这样传递的参数就是5,就显示第五页,
1.get到所有图书对象
2.计算好每一页应该有几个数据
3.根据不同的page值传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def books(request): #取从url传递的参数 page_num = request.GET.get( 'page' ) page_num = int (page_num) start = (page_num - 1 ) * 5 end = page_num * 5 #总页码数是? per_page = 5 total = models.Book.objects. all ().count() total,more = divmod (total,per_page) if more: total + = 1 all_books = models.Book.objects. all ()[start:end] #自己拼接分页的html代码 html_str_list = [] for i in range ( 1 ,total): tmp = '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{}</li>' . format (i,i) html_str_list.append(tmp) page_html = "".join(html_str_list) return render(request, 'books.html' ,{ 'books' :all_books, 'total_page' :total, 'page_html' :page_html}) |
拿到数据总量的值,每一页的数量为5,如果有余数则total+1也就是增加一个页面.
建立一个列表,去拼接a标签,最后传递给前端
前端
前端的样式用到了boottrap,可以直接看文档.
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
|
<!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < title >书记列表</ title > < link rel = "stylesheet" href = "/static/bootstrap/css/bootstrap.css" rel = "external nofollow" > </ head > < body > < div class = "container" > < table class = "table table-bordered" > < thead > < tr > < th >序号</ th > < th >id</ th > < th >书名</ th > </ tr > </ thead > < tbody > {% for book in books %} < tr > < td >{{ forloop.counter }}</ td > < td >{{ book.id }}</ td > < td >{{ book.name }}</ td > </ tr > {% endfor %} </ tbody > </ table > < nav aria-label = "Page navigation" > < ul class = "pagination" > < li > < a href = "#" rel = "external nofollow" rel = "external nofollow" aria-label = "Previous" > < span aria-hidden = "true" >«</ span > </ a > </ li > {{ page_html|safe }} < li > < a href = "#" rel = "external nofollow" rel = "external nofollow" aria-label = "Next" > < span aria-hidden = "true" >»</ span > </ a > </ li > </ ul > </ nav > </ div > </ body > </ html > |
1
|
{{ page_html|safe }} |
传递过来的page_html要用safe过滤器,不然无法转移成html.
最终效果
分页优化
设置一个首页一个尾页,以及显示局部的页面
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
|
def books(request): # 取从url传递的参数 page_num = request.GET.get( 'page' ) page_num = int (page_num) start = (page_num - 1 ) * 5 end = page_num * 5 # 总页码数是? per_page = 5 # 页面上总共展示多少页面 max_page = 11 half_max_page = max_page / / 2 # 页面上展示的页面从哪开始 page_start = page_num - half_max_page if page_start < = 1 : page_start = 1 total = models.Book.objects. all ().count() # 页面到哪结束 page_end = page_num + half_max_page if page_end > total: page_end = total page_start = total - max_page total, more = divmod (total, per_page) if more: total + = 1 all_books = models.Book.objects. all ()[start:end] # 自己拼接分页的html代码 html_str_list = [] html_str_list.append( '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</li>' . format ( 1 , 1 )) for i in range (page_start, page_end + 1 ): tmp = '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{}</li>' . format (i, i) html_str_list.append(tmp) html_str_list.append( '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >最后一页</li>' . format (total)) page_html = "".join(html_str_list) return render(request, 'books.html' , { 'books' : all_books, 'total_page' : total, 'page_html' : page_html}) |
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
原文链接:https://blog.csdn.net/qq_34788903/article/details/88136962