首页 > 编程 > Python > 正文

Django框架实现的分页demo示例

2019-11-25 12:51:14
字体:
来源:转载
供稿:网友

本文实例讲述了Django框架实现的分页。分享给大家供大家参考,具体如下:

首先初始化model,建表

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值传递

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,可以直接看文档.

<!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>
{{ page_html|safe }}

传递过来的page_html要用safe过滤器,不然无法转移成html.

最终效果

分页优化

设置一个首页一个尾页,以及显示局部的页面

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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表