分页

  • 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}}&nbsp;&nbsp;
{%else%}
<a href="/pag{{pindex}}/">{{pindex}}</a>&nbsp;&nbsp;
{%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相关推荐

  1. 2019.03.20 mvt,Django分页

    MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应. T全拼为T ...

  2. 第八篇Django分页

    Django分页 1.复杂版 data = []for i in range(1, 302):tmp = {"id": i, "name": "ale ...

  3. Django 分页查询并返回jsons数据,中文乱码解决方法

    Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...

  4. django ajax 查询,Django分页和Ajax查询

    在Django中,实现分页以在多个页面上显示查询项目是非常简单的.使用Ajax仅更新实际发生更改的页面位,而不是每次加载整个页面也是非常直接的.但是,当我们将两者结合在一起时,我发现它有点问题.Dja ...

  5. Django分页+增删改查

    Django分页+增删改查 演示 源码下载地址:https://download.csdn.net/download/qq_35622606/87719248 其他小笔记: django-admin. ...

  6. django分页实现

    Django分页 Django提供了一个类Paginator用于分页,但Paginator并不具体管理具体的页的处理,而是使用Page对象管理具体页面.下面我们以一个具体的例子来说明一下分页的实现 文 ...

  7. django分页查询

    Django分页查询(整合vue) 一.django部分 在view.py里添加分页查询方法 from django.http import JsonResponse from django.view ...

  8. Django分页的基本实现办法

    Django自带一个分页模块Pagination,具体的参考官方文档,我在这里简单介绍一下具体的例子,模拟一个常用场景,列出部分的代码出来.场景是这样的:我们有一个blog表,其中有若干条记录,我们要 ...

  9. django分页模块

    前端分页 将所有数据一次性返回给前端页面,再通过js进行分页,对数据库负担比较大. 后端分页 在数据库查询的时候,就查询出指定页的数据,不多查. Article.object.all()[:5] Qu ...

最新文章

  1. jsonp请求url长度过长的替代(ajaxcdr的使用)
  2. java对象的内存结构_JAVA 对象内存结构
  3. 项目war包部署到第三方Tomcat,访问路径必须加上项目名称的坑
  4. [BUUCTF-pwn]——jarvisoj_level302-21
  5. Linux crontab命令
  6. [转]T4模版引擎之基础入门
  7. 使用c#创建php可以调用的dll
  8. anaconda和python有什么不一样_看着一样的胶带,价格为什么不一样?
  9. MySQL(15)-----运算符和优先级查询结果拼接处理及CONCAT()、CONCAT_WAS()和GROUP_CONCAT()函数的使用
  10. win7 64bit部署SharePoint Server2010
  11. 手机怎么打开html页面,手机网页打不开怎么办?看了就知道了!
  12. FFmpeg进阶:给视频添加文字水印
  13. suse12中pip install xxx报错gcc: error: unrecognized command line option ‘-fstack-clash-protection’
  14. MySQL的enclosed-by和escaped-by
  15. 正则表达式/\$\{id\}/gi详解
  16. War3快捷键大全—常用的键
  17. 在vue中禁止input框和textarea编辑的操作
  18. PV、UV、IP理解
  19. 权限检查authority-check
  20. UOS系统升级到1050后无法正常使用输入法功能问题解决方法

热门文章

  1. 简单介绍互联网领域选择与营销方法
  2. 2022-2028年中国铁路信息化建设投资分析及前景预测报告
  3. 2022-2028年中国丁基橡胶行业市场深度分析及投资前景展望报告
  4. 2022-2028年中国清水混凝土行业供需策略分析及市场供需预测报告
  5. c++中的vector的常见使用
  6. ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装
  7. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
  8. Arm Cortex-M3 MCU性能
  9. 色彩(颜色)空间原理(下)
  10. 使用Keil语言的嵌入式C编程教程(上)