Django 分页和使用Ajax5.3
分页
- Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中
Paginator对象
- Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数
属性
- count:对象总数
- num_pages:页面总数
- page_range:页码列表,从1开始,例如[1, 2, 3, 4]
方法
- page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常
异常exception
- InvalidPage:当向page()传入一个无效的页码时抛出
- PageNotAnInteger:当向page()传入一个不是整数的值时抛出
- EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
Page对象
创建对象
- Paginator对象的page()方法返回Page对象,不需要手动构造
属性
- object_list:当前页上所有对象的列表
- number:当前页的序号,从1开始
- paginator:当前page对象相关的Paginator对象
方法
- has_next():如果有下一页返回True
- has_previous():如果有上一页返回True
- has_other_pages():如果有上一页或下一页返回True
- next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
- previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
- len():返回当前页面对象的个数
- 迭代页面对象:访问当前页面中的每个对象
示例
创建视图pagTest
from django.core.paginator import Paginatordef pagTest(request, pIndex):list1 = AreaInfo.objects.filter(aParent__isnull=True)p = Paginator(list1, 10)if pIndex == '':pIndex = '1'pIndex = int(pIndex)list2 = p.page(pIndex)plist = p.page_rangereturn render(request, 'booktest/pagTest.html', {'list': list2, 'plist': plist, 'pIndex': pIndex})
配置url
url(r'^pag(?P<pIndex>[0-9]*)/$', views.pagTest, name='pagTest'),
定义模板pagTest.html
<!DOCTYPE html>
<html>
<head><title></title>
</head>
<body>
<ul>
{%for area in list%}
<li>{{area.id}}--{{area.atitle}}</li>
{%endfor%}
</ul>{%for pindex in plist%}
{%if pIndex == pindex%}
{{pindex}}
{%else%}
<a href="/pag{{pindex}}/">{{pindex}}</a>
{%endif%}
{%endfor%}
</body>
</html>
使用Ajax
- 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差
- 改进方案:通过ajax的方式获取数据,通过dom操作将数据呈现到界面上
- 推荐使用框架的ajax相关方法,不要使用XMLHttpRequest对象,因为操作麻烦且不容易查错
- jquery框架中提供了$.ajax、$.get、$.post方法,用于进行异步交互
- 由于csrf的约束,推荐使用$.get
- 示例:实现省市区的选择
- 最终实现效果如图:
引入js文件
- js文件属于静态文件,创建目录结构如图:
修改settings.py关于静态文件的设置
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
]
在models.py中定义模型
class AreaInfo(models.Model):aid = models.IntegerField(primary_key=True)atitle = models.CharField(max_length=20)aPArea = models.ForeignKey('AreaInfo', null=True)
生成迁移
python manage.py makemigrations
python manage.py migrate
通过workbench向表中填充示例数据
- 参见“省市区.sql”
- 注意将表的名称完成替换
在views.py中编写视图
- index用于展示页面
- getArea1用于返回省级数据
- getArea2用于根据省、市编号返回市、区信息,格式都为字典对象
from django.shortcuts import render
from django.http import JsonResponse
from models import AreaInfodef index(request):return render(request, 'ct1/index.html')def getArea1(request):list = AreaInfo.objects.filter(aPArea__isnull=True)list2 = []for a in list:list2.append([a.aid, a.atitle])return JsonResponse({'data': list2})def getArea2(request, pid):list = AreaInfo.objects.filter(aPArea_id=pid)list2 = []for a in list:list2.append({'id': a.aid, 'title': a.atitle})return JsonResponse({'data': list2})
在urls.py中配置urlconf
from django.conf.urls import url
from . import viewsurlpatterns = [url(r'^$', views.index),url(r'^area1/$', views.getArea1),url(r'^([0-9]+)/$', views.getArea2),
]
主urls.py中包含此应用的url
from django.conf.urls import include, url
from django.contrib import adminurlpatterns = [url(r'^', include('ct1.urls', namespace='ct1')),url(r'^admin/', include(admin.site.urls)),
]
定义模板index.html
- 在项目中的目录结构如图:
- 修改settings.py的TEMPLATES项,设置DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],
- 定义模板文件:包含三个select标签,分别存放省市区的信息
<!DOCTYPE html>
<html>
<head><title>省市区列表</title>
</head>
<body>
<select id="pro"><option value="">请选择省</option>
</select>
<select id="city"><option value="">请选择市</option>
</select>
<select id="dis"><option value="">请选择区县</option>
</select>
</body>
</html>
在模板中引入jquery文件
<script type="text/javascript" src="static/ct1/js/jquery-1.12.4.min.js"></script>
编写js代码
- 绑定change事件
- 发出异步请求
- 使用dom添加元素
<script type="text/javascript">$(function(){$.get('area1/',function(dic) {pro=$('#pro')$.each(dic.data,function(index,item){pro.append('<option value='+item[0]+'>'+item[1]+'</option>');})});$('#pro').change(function(){$.post($(this).val()+'/',function(dic){city=$('#city');city.empty().append('<option value="">请选择市</option>');$.each(dic.data,function(index,item){city.append('<option value='+item.id+'>'+item.title+'</option>');})});});$('#city').change(function(){$.post($(this).val()+'/',function(dic){dis=$('#dis');dis.empty().append('<option value="">请选择区县</option>');$.each(dic.data,function(index,item){dis.append('<option value='+item.id+'>'+item.title+'</option>');})})});});</script>
Django 分页和使用Ajax5.3相关推荐
- 2019.03.20 mvt,Django分页
MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应. T全拼为T ...
- 第八篇Django分页
Django分页 1.复杂版 data = []for i in range(1, 302):tmp = {"id": i, "name": "ale ...
- Django 分页查询并返回jsons数据,中文乱码解决方法
Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...
- django ajax 查询,Django分页和Ajax查询
在Django中,实现分页以在多个页面上显示查询项目是非常简单的.使用Ajax仅更新实际发生更改的页面位,而不是每次加载整个页面也是非常直接的.但是,当我们将两者结合在一起时,我发现它有点问题.Dja ...
- Django分页+增删改查
Django分页+增删改查 演示 源码下载地址:https://download.csdn.net/download/qq_35622606/87719248 其他小笔记: django-admin. ...
- django分页实现
Django分页 Django提供了一个类Paginator用于分页,但Paginator并不具体管理具体的页的处理,而是使用Page对象管理具体页面.下面我们以一个具体的例子来说明一下分页的实现 文 ...
- django分页查询
Django分页查询(整合vue) 一.django部分 在view.py里添加分页查询方法 from django.http import JsonResponse from django.view ...
- Django分页的基本实现办法
Django自带一个分页模块Pagination,具体的参考官方文档,我在这里简单介绍一下具体的例子,模拟一个常用场景,列出部分的代码出来.场景是这样的:我们有一个blog表,其中有若干条记录,我们要 ...
- django分页模块
前端分页 将所有数据一次性返回给前端页面,再通过js进行分页,对数据库负担比较大. 后端分页 在数据库查询的时候,就查询出指定页的数据,不多查. Article.object.all()[:5] Qu ...
最新文章
- jsonp请求url长度过长的替代(ajaxcdr的使用)
- java对象的内存结构_JAVA 对象内存结构
- 项目war包部署到第三方Tomcat,访问路径必须加上项目名称的坑
- [BUUCTF-pwn]——jarvisoj_level302-21
- Linux crontab命令
- [转]T4模版引擎之基础入门
- 使用c#创建php可以调用的dll
- anaconda和python有什么不一样_看着一样的胶带,价格为什么不一样?
- MySQL(15)-----运算符和优先级查询结果拼接处理及CONCAT()、CONCAT_WAS()和GROUP_CONCAT()函数的使用
- win7 64bit部署SharePoint Server2010
- 手机怎么打开html页面,手机网页打不开怎么办?看了就知道了!
- FFmpeg进阶:给视频添加文字水印
- suse12中pip install xxx报错gcc: error: unrecognized command line option ‘-fstack-clash-protection’
- MySQL的enclosed-by和escaped-by
- 正则表达式/\$\{id\}/gi详解
- War3快捷键大全—常用的键
- 在vue中禁止input框和textarea编辑的操作
- PV、UV、IP理解
- 权限检查authority-check
- UOS系统升级到1050后无法正常使用输入法功能问题解决方法
热门文章
- 简单介绍互联网领域选择与营销方法
- 2022-2028年中国铁路信息化建设投资分析及前景预测报告
- 2022-2028年中国丁基橡胶行业市场深度分析及投资前景展望报告
- 2022-2028年中国清水混凝土行业供需策略分析及市场供需预测报告
- c++中的vector的常见使用
- ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装
- PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
- Arm Cortex-M3 MCU性能
- 色彩(颜色)空间原理(下)
- 使用Keil语言的嵌入式C编程教程(上)