Django提供了一个非常实用的模块Paginator,可以对大量的数据进行分页处理,比原生的自行分页方式更简洁。
下面先对原生的分页方式进行一下介绍,熟悉Paginator分页器的原理:
我们可以通过在地址栏里面传参(页码和每页的最大数据量),在views.py里面get参数进行分页。
view.py内容:
def get(req):
page = int(req.GET.get("page",1))
#传递参数 page 无参数时默认值为1
per_page = int(req.GET.get("per_page",5))
#传递参数 per_page 无参数时默认值为 5
news = News.objects.all()[per_page*(page-1):per_page*page]
#根据已知参数对数据库数据进行切割,这里要注意对page和per_page
#进行数据转换。News是我的一个表
return render(req,"test.html",{"news":news})
html内容:(body等略)
{% for foo in news %}
- {{ foo.tag }}
{% endfor %}
下面开始介绍Paginator的使用:
首先导入模块
from django.core.paginator import Paginator
view.py:
def get(req):
page = int(req.GET.get("page",1))
per_page = int(req.GET.get("per_page",10))
news = News.objects.all()
paginator = Paginator(news,per_page)
#利用分页器将news切割,每个paginator含有per_page条数据
object = paginator.page(page)
#paginator.page用于分页,object用于显示第几页的数据
return render(req,"test.html",{"object":object})
html:
{% for foo in object %}
- {{ foo.tag }}
{% endfor %}
显示结果跟原生方式一样
然而我们平时所见的网页都会有页码。在Paginator中对应的是page_range
在上述view.py内添加语句
page_range = paginator.page_range
render 添加返回集
return render(req,"test.html",{"object":object,"page_range":page_range})
html添加语句:
{% for page_index in page_range %}
- {{ page_index }}
{% endfor %}
扩展:
(一):对于传入的数据集还有很多操作比如上一页和下一页,如下图所示,可以根据需要添加样式:另外,页码的美化可以通过bootstrap进行修饰。
(二): paginator小知识
定位到paginator.py 观察代码结构structure有一个page_range函数,观察返回值,paginator帮我们自动返回从1开始的页码。
以上内容如有描述错误之处,希望各位指正。如需转载,望注明出处。