python django 之 django自带的分页
1. 例1: 基础的分页
1). vim app01/views.py
def users(request):
from django.core.paginator import Paginator
curent_page = request.GET.get('p', 1) # 想获取的页数, 没有指定就返回第一页
user_list = District.objects.all()
paginator = Paginator(user_list, 10) # 每页 10 个数据
"""
参数:
object_list : 传入一个对象, 从数据库中取出的数据对象 ,也就是上面的 user_list
per_page : 每页的页数
orphans=0 :
allow_empty_first_page=True
"""
# 对象.page(获取的页数) # 获取指定页数的数据
obj = paginator.page(curent_page) # 参数为 : 要获取的页数
# obj 对象中的方法:
# {{ obj.has_next }} 是否有下一页
# {{ obj.next_page_number }} 下一页页码
# {{ obj.has_previous }} 是否有上一页
# {{ obj.previous_page_number }} 上一页页码
# {{ obj.object_list }} 分页之后的数据列表
# {{ obj.number }} 当前页
# {{ obj.paginator }} paginator 对象 就是 paginator = Paginator(list, nmber) 这个方法是为了调用其下的方法
return render(request, 'index.html', {'obj': obj})
2). vim templates/index.html
{% for i in page_obj.object_list %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.password }}</td>
<td>{{ i.email }}</td>
</tr>
{% endfor %}
3). 例1 知识点
(1): paginator = Paginator(user_list, 10) 对象的参数
(2): obj = paginator.page(curent_page) 的方法 # 参数为 : 要获取的页数
obj 对象中的方法:
{{ obj.has_next }} 是否有下一页
{{ obj.next_page_number }} 下一页页码
{{ obj.has_previous }} 是否有上一页
{{ obj.previous_page_number }} 上一页页码
{{ obj.object_list }} 分页之后的数据列表
{{ obj.number }} 当前页
{{ obj.paginator }} paginator 对象 就是 paginator = Paginator(list, nmber) 这个方法是为了调用其下的方法
注意: 这几个方法不是在 Python 在中使用的, 而是在模板语法中调用的, 如 例 4.3 例子
2. 处理异常
问题描述
UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list:
/laojia/reboot/opsweb/accounts/views.py:234:
UnorderedObjectListWarning: Pagination may yield inconsistent results
with an unordered object_list: <class
'django.contrib.auth.models.User'> QuerySet.
paginator = Paginator(user_list, self.paginate_by)
这个是因为django,查询出来多条记录时,默认是无序排列的,所以 每查询一次 分页的 list 都是不一样的。
解决方法:
查询的时候,增加一个排序就可以了
user_list = Profile.objects.get_queryset().order_by('id')
或者
user_list = models.District.objects.all().order_by('id')
但是这样写, 会占用资源
3. 例2:
3.1. 例二解释
(1): 处理 ?p 参数 不正确时 报错
(2): 添加 上一页, 下一页
3.2. 修改视图函数
def users(request):
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# 导入 两个 处理报错的 模块
# EmptyPage : 处理数字不正却时报错
# PageNotAnInteger : 处理不是数字报错
curent_page = request.GET.get('p', 1) # 想获取的页数, 没有指定就返回第一页
user_list = models.District.objects.all().order_by('id')
paginator = Paginator(user_list,10)
try:
page_obj = paginator.page(curent_page)
except EmptyPage as e:
page_obj = paginator.page(1)
except PageNotAnInteger as not_int_err:
page_obj = paginator.page(1)
return render(request, 'index.html', {'page_obj': page_obj})
4.3. vim templates/index.html
<center>
<table border="1" cellspacing="0" width="500">
<tr>
<th>ID</th>
<th>用户名</th>
<th>密码</th>
<th>邮箱</th>
</tr>
{% for i in page_obj.object_list %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.password }}</td>
<td>{{ i.email }}</td>
</tr>
{% endfor %}
</table>
<div>
{% if page_obj.has_previous %}
<a href="/users?p={{ page_obj.previous_page_number }}">上一页</a>
{% else %}
<a href="">上一页</a>
{% endif %}
{% if page_obj.has_next %}
<a href="/users?p={{ page_obj.next_page_number }}">下一页</a>
{% else %}
<a href="">下一页</a>
{% endif %}
</div>
</center>
3.4. 例3 知识点总结
(1): 使用了 列2 中的知识点 paginator.page(curent_page) 中的方法
(2): 添加了两个议程处理模块
4. 例3:
4.1. 介绍
1). 使用 {{ page_obj.paginator }} 的方法
2). 在页面上添加的页数
3). 添加页码
4). 添加 当前页 与 尾页
4.2. 知识点
1). {{ page_obj.paginator }} : page_obj 就是传到 html 的对象 实际上就是 Paginator() 对象
2). {{ page_obj.paginator }} : 的方法
per_page : 每页显示条目数量
count : 数据总个数
num_pages : 总页数
page_range : 总页数的索引范围,如: 如果 总页数是 11, name 这个值就是 (1,12) 由于不取尾的缘故所以 11+1
使用时加 .count 即可, 如 : {{ page_obj.paginator.count }}
4.3. 视图函数不变
4.4. 修改 center 下的 div
<div>
{% if page_obj.has_previous %}
<a href="/users?p={{ page_obj.previous_page_number }}">上一页</a>
{% else %}
<a href="">上一页</a>
{% endif %}
{# 5.3. 新添加 内容, 显示页码 #}
{% for i in page_obj.paginator.page_range %}
<a href="/users?p={{ i }}">{{ i }}</a>
{% endfor %}
{% if page_obj.has_next %}
<a href="/users?p={{ page_obj.next_page_number }}">下一页</a>
{% else %}
<a href="">下一页</a>
{% endif %}
{# 5.3. 添加 当前页 与 尾页 #}
<span>{{ page_obj.number }}/</span> {# 当前页 #}
<span>{{ page_obj.paginator.num_pages }}</span> {# 总页数 #}
</div>
4. 缺点
django 无法解决页码过多的问题, 需要自己进行扩展
python django 之 django自带的分页的更多相关文章
- 比Django官方实现更好的分页组件+Bootstrap整合
前言 Django全家桶自带的分页组件只能说能满足分页这个功能,但是没那么好用就是了 Django的分页效果 django-pure-pagination分页效果 使用方法 首先安装: pip ins ...
- Django - Cookie、Session、自定义分页和Django分页器
2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...
- python web框架 Django进阶
django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...
- 6月15日 python学习总结 Django模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- Python攻关之Django(一)
课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...
- python框架之django
python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...
- Python之路-(Django进阶一)
Django请求生命周期: 首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view. 然后,app通过判断,拿到数据库数据和html模板文件. 最后,将拿 ...
- 第六篇:web之python框架之django
python框架之django python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...
- Django rest framework(7)----分页
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Python web(Django)连接Sql server
(开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...
随机推荐
- windows下pip的安装
安装地址:https://pypi.python.org/pypi/pip#downloads 下载完成后,找到文件并进行解压,找到下面路径. 打开cmd,cd到当前目录下,然后执行下面命令: pyt ...
- mplayer 的安装步骤
编译mplayer: make distclean ./configure --disable-png --disable-gif //加后面的是因为编译时出错了,也可以直接 ./con ...
- js几个常用的弹层
js弹层技术很常见,自己每次用上网找,一找一大堆. 对比了几种,考虑通用性和易用性,这里记录两个. jQueryUI的http://jqueryui.com/dialog/#modal-form ar ...
- 二、linux-mysql -cmake方式安装mysql 5.5
1.安装解压cmake包 cmake软件cd /home/oldboy/tools/tar xf cmake-2.8.8.tar.gzcd cmake-2.8.8./configure#CMake ...
- Docker系列五: docker-compose部署Docker容器
Docker使用Dockerfile来实现对现有镜像的修改来创建新的镜像, 那docker-compose则完成镜像的自动部署, 可以实现多个容器同时部署 Dockerfile可以让用户管理一个单独的 ...
- Docker系列四: 使用UI管理docker容器
一.什么是Portainer? Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容 ...
- python通过ssh读写远程数据
1.适用场景 需要读取(写)多台远程机器下的一个或多个文件,如果要通过 os.system('scp ......')来完成就必须配置免密登陆,比较麻烦 2.准备工作, 安装依赖 pip instal ...
- winfrom控件圆角
刚好用到这个功能,看了好些例子.我就不明白,简单的一个事,一些文章里的代码写的那个长啊,还让人看么. 精简后,就其实一点,只要有paint事件的组件,都可画圆角,没有的外面套一个panel就行了. u ...
- 接口测试 requests的身份认证方式
requests提供多种身份认证方式,包括基本身份认证.netrc 认证.摘要式身份认证.OAuth 1 认证.OAuth 2 与 OpenID 连接认证.自定义认证.这些认证方式的应用场景是什么呢? ...
- getline的使用
函数定义: getline(istream &in, string &s) 作用: 在C++中用 string 类型进行终端输入字符串时,解决无法输入带有空格的字符串的问题. 功能: ...