Django 中的分页
准备工作
先在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>
Fake it,till you make it