本帖最后由 阿奇_o 于 2021-9-14 11:35 编辑
可以研究一下 Django的分页方法:https://docs.djangoproject.com/zh-hans/3.1/topics/pagination/
试验:In [24]: pages = Paginator(Test.objects.get_queryset().order_by('id'), 5) # ORM获取Test表的所有记录并按id排序。 每页分5条数据。
In [25]: pages.count # 一共多少条数据
Out[25]: 50
In [26]: pages.num_pages # 分成了10页
Out[26]: 10
In [27]: pages.page(1).object_list # 获取第一页的对象列表(每个元素对应着Test表的一行记录)
Out[27]: <QuerySet [<Test: Test object (1)>, <Test: Test object (2)>, <Test: Test object (3)>, <Test: Test object (4)>, <Test: Test object (5)>]>
In [28]: pages.page(2).object_list # 第二页的
Out[28]: <QuerySet [<Test: Test object (6)>, <Test: Test object (7)>, <Test: Test object (8)>, <Test: Test object (9)>, <Test: Test object (10)>]>
In [29]: for row_obj in pages.page(2).object_list: # 遍历看看
...: print(row_obj.id, row_obj.sname, row_obj.age)
...:
6 FakeName 18
7 FakeName 18
8 FakeName 18
9 FakeName 18
10 FakeName 18
In [30]: pages.page(2).next_page_number() #
Out[30]: 3
In [32]: curr_page = pages.page(2)
In [33]: curr_page.number # 当前页为第几页
Out[33]: 2
In [34]: theNextPage = pages.page(curr_page.number + 1) # 获取下一页的"页对象"(也可以用 curr_page.next_page_number() )
In [35]:
参考:
https://docs.djangoproject.com/en/3.2/intro/tutorial02/#playing-with-the-api
https://docs.djangoproject.com/zh-hans/3.1/topics/pagination/
https://stackoverflow.com/questions/44033670/python-django-rest-framework-unorderedobjectlistwarning
补充:
# views.py里
def listing(request):
Test_list = Test.objects.get_queryset().order_by('id')
paginator = Paginator(Test_list, 10) # Show 10 per page.
# page_number = request.GET.get('page', 1)
page_num = request.GET['num'] # url要像 ...:8000/page?num=2 (其中'/page'的'page'是你在urls.py里定义的)
page_obj = paginator.get_page(page_num)
# page_obj = paginator.get_page(1)
return render(request, 'listing.html', {'page_obj': page_obj})
再补充:
# url为 http://...:8000/usepandas (在urls.py 增加定义 path('usepandas', views.usepandas)
def usepandas(request):
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+mysqldb://root:123456@localhost/djangodb')
sql = "select * from djangodb.Test where id >= 11 limit 10" # 这里就可以用SQL实现分页
df = pd.read_sql(sql, engine)
# print(df)
# return HttpResponse("OK using Pandas.")
return HttpResponse( "<h3>11-20条记录:<h3>" + df.to_html() )
# 模板:templates/listing.html
<!DOCTYPE html>
<html>
<head>
<!-- Required meta tags -->
<!-- Bootstrap CSS 调用在线的前端框架 -->
<link rel="stylesheet"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body>
<p>当前页号: {{ page_obj.number}} </p>
<p>注:以下需要借助前端框架(如Bootstrap),才能"比较好看地"显示表格和数据</p>
<main role="main" class="container">
<div class="row"></div>
<h1>Use the table </h1>
<table class="table table-bordered">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>age</th>
</tr>
</thead>
<tbody>
{% for user in page_obj %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.sname }}</td>
<td>{{ user.age }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if page_obj.has_other_pages %}
<ul class="pagination">
{% if page_obj.has_previous %}
<li><a href="/page?num={{ page_obj.previous_page_number }}"> 上一页«</a></li>
<!-- 如果支持函数调用 page_obj.previous_page_number() 就可以正确跳转。 -->
{% else %}
<li class="disabled"><span>«</span></li>
{% endif %}
{% for i in page_obj.paginator.page_range %}
{% if page_obj.number == i %}
<li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
{% else %}
<li><a href="/page?num={{ i }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li><a href="/page?num={{ page_obj.next_page_number }}"> 下一页»</a></li>
{% else %}
<li class="disabled"><span>»</span></li>
{% endif %}
</ul>
{% endif %}
</div>
</main>
<h5> <a href="/usepandas"> ------- 简单实现的话,直接用 pandas (点击跳转到)------- </a></h5>
</body>
注:以上方法只是我做实验和学习用,实际生产中应该很少有人会这样写,哈哈,通常会用 AJAX技术,以及各种前端框架。
之前只是对Django入了半个门,对于分页等功能,我也是现学现卖,这里主要是为了复习一下MVCT的关系。
具体怎么用,你根据自己的情况,参考着来吧。
注:模板文件 有问题,暂时无法实现点击 <<上/下一页>> 进行跳转。 Django模板语法不支持简单的函数调用!太鸡肋了。。
|