Django 开发:自定义分页类和用法概述
1。关于为什么需要分页
在处理大量数据时,如果一次性查询数据有响应,必然会对内存和服务器负载产生影响,而且影响会比较低。界面的响应能力,影响用户体验。一种常见的方式是分段向用户显示数据。如果当前段中没有所需数据,您可以通过翻页或输入特定页码来查看其他数据。
Django 提供默认分页功能,但也允许自定义分页以满足特定需求。
2。默认 Django 分页(函数视图)
在视图中,使用 Django 提供的 Paginator 类对数据进行分页。一般与Django的Template
1配合使用。必须实现分页和要分页的数据模型。 ? 4. 在模板模板中使用page_data
显示数据并导航分页
<ul>
{% for post in page_data %}
<li> {{ post.title }}</li>
{% endfor %}
</ul>
<br>
<!-- 分页导航 -->
<div class='pagination'>
{% if page_data.has_previous %}
<span>
<a href="?page=1">« 首页</a>
<a href="?page={{ page_data.previous_page_number }}">前一页</a>
</span>
{% endif %}
当前页码: {{ page_data.number }} / {{ page_data.paginator.count }}
{% if page_data.has_next %}
<span>
<a href="?page={{ page_data.next_page_number }}">后一页</a>
<a href="?page={{ page_data.paginator.num_pages }}">« 尾页</a>
</span>
{% endif %}
</div>
实际效果如下图:Django模板示例分页实现。类视图)
上面介绍了如何使用Django的函数视图
中的分页功能。本文介绍如何使用类视图
中的分页功能。
熟悉Django函数视图和类视图的同学很容易认出这一点。如何将上面的函数视图转换为类视图。
其实很简单。类视图中的get()
方法的代码逻辑就是上面函数视图中的代码。像这样
class PostListViewDemo(View):
def get(self, request):
# 获取数据
posts = Post.objects.all()
# 创建Paginator对象
paginator = Paginator(posts, per_page=3)
# 或者当前页码
page_number = request.GET.get('page', 1)
# 获取 页码对应的数据
page_data = paginator.get_page(page_number)
# 这里输出debug日志,
print(page_data, type(page_data), dir(page_data))
# 数据渲染到 template模板中去
return render(request, 'posts/list2.html', {'page_data': page_data})
主要需要在URL中设置路由。类视图必须使用 as_view()
方法如下
from django.urls import path
from appdemo.views import post_list, PostListViewDemo
urlpatterns = [
path('list1/', post_list, name='post-list-1'),
# 注意这里
path('list2/', PostListViewDemo.as_view(), name='post-list-2'),
]
四、更简单的分页实现 Django 类视图
我们知道它只能用在数据量大的情况下,所以列出的数据在
时使用分页。? posts/list3.html
无法使用前面两种方法中的自定义对象page_data
。请改用固定格式对象 page_obj
。
具体信息请查看Django源码 因为ListView继承了 默认本例使用Django+Template进行前后端开发。 Django提供的Paginator类已经可以满足日常需求了。 由于对象 Method 以上两个方法用于获取当前页码对应的数据。区别是: 1。返回值不同 1.1, 1.2 返回 2.2, 属性 方法 django.views.generic.list.MultipleObjectMixin
类get_context_data()get_context_data()源代码说明
方法,get 方法调用 context MultipleObjectTemplateResponseMixin
和 BaseListView
定义了噀ListView=自我。 get_context_data()
然后 get 返回上下文,方法 get_context_data()
在 MultipleObjectTemplate❙❀ResponseMixin‾5 中定义。关于Django原生自定义分页
Page
提供了不同情况下的分页操作,这里简单介绍一下属性器的属性❙•分页器。 count 返回所有页面上的对象总数
get_page
返回一个Page
对象,可以用来访问页码和当前页等数据页信息,如下页面属性和方法的总结,page
一个 QuerySet
对象,可以处理普通分页数据。 ? (不会引发异常)page
方法会引发PageNotAnInteger或EmptyPage异常,需要在代码中处理。页面属性和方法
• Page.number 返回当前页码
Paginator
对象
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。