前后端传输数据的编码格式(contentType)

  1. # 我们主要研究post请求数据的编码格式
  2. """
  3. get请求数据就是直接放在url后面的
  4. url?username=jason&password=123
  5. """
  6. # 可以朝后端发送post请求的方式
  7. """
  8. 1.form表单
  9. 2.ajax请求
  10. """
  11. """
  12. 前后端传输数据的编码格式
  13. urlencoded
  14. formdata
  15. json
  16. """
  17. # 研究form表单
  18. 默认的数据编码格式是urlencoded
  19. 数据格式:username=jason&password=123
  20. django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST
  21. username=jason&password=123 >>> request.POST
  22. 如果你把编码格式改成formdata,那么针对普通的键值对还是解析到request.POST中而将文件解析到request.FILES
  23. form表单是没有办法发送json格式数据的
  24. # 研究ajax
  25. 默认的编码格式也是urlencoded
  26. 数据格式:username=jason&age=20
  27. django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST
  28. username=jason&age=20 >>> request.POST

ajax发送json格式数据

  1. """
  2. 前后端传输数据的时候一定要确保编码格式跟数据真正的格式是一致的
  3. 不要骗人家!!!
  4. {"username":"jason","age":25}
  5. 在request.POST里面肯定找不到
  6. django针对json格式的数据 不会做任何的处理
  7. request对象方法补充
  8. request.is_ajax()
  9. 判断当前请求是否是ajax请求 返回布尔值
  10. """
  11. <script>
  12. $('#d1').click(function () {
  13. $.ajax({
  14. url:'',
  15. type:'post',
  16. data:JSON.stringify({'username':'jason','age':25}),
  17. contentType:'application/json', // 指定编码格式
  18. success:function () {
  19. }
  20. })
  21. })
  22. </script>
  23. json_bytes = request.body
  24. json_str = json_bytes.decode('utf-8')
  25. json_dict = json.loads(json_str)
  26. # json.loads括号内如果传入了一个二进制格式的数据那么内部自动解码再反序列化
  27. json_dict = json.loads(json_bytes)
  28. """
  29. ajax发送json格式数据需要注意点
  30. 1.contentType参数指定成:application/json
  31. 2.数据是真正的json格式数据
  32. 3.django后端不会帮你处理json格式数据需要你自己去request.body获取并处理
  33. """

ajax发送文件

  1. """
  2. ajax发送文件需要借助于js内置对象FormData
  3. """
  4. <script>
  5. // 点击按钮朝后端发送普通键值对和文件数据
  6. $('#d4').on('click',function () {
  7. // 1 需要先利用FormData内置对象
  8. let formDateObj = new FormData();
  9. // 2 添加普通的键值对
  10. formDateObj.append('username',$('#d1').val());
  11. formDateObj.append('password',$('#d2').val());
  12. // 3 添加文件对象
  13. formDateObj.append('myfile',$('#d3')[0].files[0])
  14. // 4 将对象基于ajax发送给后端
  15. $.ajax({
  16. url:'',
  17. type:'post',
  18. data:formDateObj, // 直接将对象放在data后面即可
  19. // ajax发送文件必须要指定的两个参数
  20. contentType:false, // 不需使用任何编码 django后端能够自动识别formdata对象
  21. processData:false, // 告诉你的浏览器不要对你的数据进行任何处理
  22. success:function (args) {
  23. }
  24. })
  25. })
  26. </script>
  27. def ab_file(request):
  28. if request.is_ajax():
  29. if request.method == 'POST':
  30. print(request.POST)
  31. print(request.FILES)
  32. return render(request,'ab_file.html')
  33. """
  34. 总结:
  35. 1.需要利用内置对象FormData
  36. // 2 添加普通的键值对
  37. formDateObj.append('username',$('#d1').val());
  38. formDateObj.append('password',$('#d2').val());
  39. // 3 添加文件对象
  40. formDateObj.append('myfile',$('#d3')[0].files[0])
  41. 2.需要指定两个关键性的参数
  42. contentType:false, // 不需使用任何编码 django后端能够自动识别formdata对象
  43. processData:false, // 告诉你的浏览器不要对你的数据进行任何处理
  44. 3.django后端能够直接识别到formdata对象并且能够将内部的普通键值自动解析并封装到request.POST中 文件数据自动解析并封装到request.FILES中
  45. """

django自带的序列化组件(drf做铺垫)

  1. """
  2. 如果发现你可以直接使用MySQL但是无法使用sqlite3
  3. 不要慌张不要恐惧 你只需要按照之前MySQL的操作将sqlite3的驱动装一下即可
  4. """
  5. # 需求:在前端给我获取到后端用户表里面所有的数据 并且要是列表套字典
  6. import json
  7. from django.http import JsonResponse
  8. from django.core import serializers
  9. def ab_ser(request):
  10. user_queryset = models.User.objects.all()
  11. # [{},{},{},{},{}]
  12. # user_list = []
  13. # for user_obj in user_queryset:
  14. # tmp = {
  15. # 'pk':user_obj.pk,
  16. # 'username':user_obj.username,
  17. # 'age':user_obj.age,
  18. # 'gender':user_obj.get_gender_display()
  19. # }
  20. # user_list.append(tmp)
  21. # return JsonResponse(user_list,safe=False)
  22. # return render(request,'ab_ser.html',locals())
  23. # 序列化
  24. res = serializers.serialize('json',user_queryset)
  25. """会自动帮你将数据变成json格式的字符串 并且内部非常的全面"""
  26. return HttpResponse(res)
  27. """
  28. [
  29. {"pk": 1, "username": "jason", "age": 25, "gender": "male"},
  30. {"pk": 2, "username": "egon", "age": 31, "gender": "female"},
  31. {"pk": 3, "username": "kevin", "age": 32, "gender": "others"},
  32. {"pk": 4, "username": "tank", "age": 40, "gender": 4}
  33. ]
  34. 前后端分离的项目
  35. 作为后端开发的你只需要写代码将数据处理好
  36. 能够序列化返回给前端即可
  37. 再写一个接口文档 告诉前端每个字段代表的意思即可
  38. [
  39. { "model": "app01.user",
  40. "pk": 1,
  41. "fields": {"username": "jason", "age": 25, "gender": 1}},
  42. { "model": "app01.user",
  43. "pk": 2,
  44. "fields": {"username": "egon", "age": 31, "gender": 2}},
  45. { "model": "app01.user",
  46. "pk": 3,
  47. "fields": {"username": "kevin", "age": 32, "gender": 3}},
  48. { "model": "app01.user",
  49. "pk": 4,
  50. "fields": {"username": "tank", "age": 40, "gender": 4}}
  51. ]
  52. 写接口就是利用序列化组件渲染数据然后写一个接口文档 该交代交代一下就完事
  53. """

ajax结合sweetalert

  1. """
  2. 自己要学会如何拷贝
  3. 学会基于别人的基础之上做修改
  4. 研究各个参数表示的意思 然后找葫芦画瓢
  5. """
  6. <script>
  7. $('.del').on('click',function () {
  8. // 先将当前标签对象存储起来
  9. let currentBtn = $(this);
  10. // 二次确认弹框
  11. swal({
  12. title: "你确定要删吗?",
  13. text: "你可要考虑清除哦,可能需要拎包跑路哦!",
  14. type: "warning",
  15. showCancelButton: true,
  16. confirmButtonClass: "btn-danger",
  17. confirmButtonText: "是的,老子就要删!",
  18. cancelButtonText: "算了,算了!",
  19. closeOnConfirm: false,
  20. closeOnCancel: false,
  21. showLoaderOnConfirm: true
  22. },
  23. function(isConfirm) {
  24. if (isConfirm) {
  25. // 朝后端发送ajax请求删除数据之后 再弹下面的提示框
  26. $.ajax({
  27. {#url:'/delete/user/' + currentBtn.attr('delete_id'), // 1 传递主键值方式1#}
  28. url:'/delete/user/', // 2 放在请求体里面
  29. type:'post',
  30. data:{'delete_id':currentBtn.attr('delete_id')},
  31. success:function (args) { // args = {'code':'','msg':''}
  32. // 判断响应状态码 然后做不同的处理
  33. if(args.code === 1000){
  34. swal("删了!", args.msg, "success");
  35. // 1.lowb版本 直接刷新当前页面
  36. {#window.location.reload()#}
  37. // 2.利用DOM操作 动态刷新
  38. currentBtn.parent().parent().remove()
  39. }else{
  40. swal('完了','出现了位置的错误','info')
  41. }
  42. }
  43. })
  44. } else {
  45. swal("怂逼", "不要说我认识你", "error");
  46. }
  47. });
  48. })
  49. </script>

批量插入

  1. def ab_pl(request):
  2. # 先给Book插入一万条数据
  3. # for i in range(10000):
  4. # models.Book.objects.create(title='第%s本书'%i)
  5. # # 再将所有的数据查询并展示到前端页面
  6. book_queryset = models.Book.objects.all()
  7. # 批量插入
  8. # book_list = []
  9. # for i in range(100000):
  10. # book_obj = models.Book(title='第%s本书'%i)
  11. # book_list.append(book_obj)
  12. # models.Book.objects.bulk_create(book_list)
  13. """
  14. 当你想要批量插入数据的时候 使用orm给你提供的bulk_create能够大大的减少操作时间
  15. :param request:
  16. :return:
  17. """
  18. return render(request,'ab_pl.html',locals())

分页器

  1. """
  2. 总数据100 每页展示10 需要10
  3. 总数据101 每页展示10 需要11
  4. 总数据99 每页展示10 需要10
  5. 如何通过代码动态的计算出到底需要多少页?
  6. 在制作页码个数的时候 一般情况下都是奇数个 符合中国人对称美的标准
  7. """
  8. # 分页
  9. book_list = models.Book.objects.all()
  10. # 想访问哪一页
  11. current_page = request.GET.get('page',1) # 如果获取不到当前页码 就展示第一页
  12. # 数据类型转换
  13. try:
  14. current_page = int(current_page)
  15. except Exception:
  16. current_page = 1
  17. # 每页展示多少条
  18. per_page_num = 10
  19. # 起始位置
  20. start_page = (current_page - 1) * per_page_num
  21. # 终止位置
  22. end_page = current_page * per_page_num
  23. # 计算出到底需要多少页
  24. all_count = book_list.count()
  25. page_count, more = divmod(all_count, per_page_num)
  26. if more:
  27. page_count += 1
  28. page_html = ''
  29. xxx = current_page
  30. if current_page < 6:
  31. current_page = 6
  32. for i in range(current_page-5,current_page+6):
  33. if xxx == i:
  34. page_html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
  35. else:
  36. page_html += '<li><a href="?page=%s">%s</a></li>'%(i,i)
  37. book_queryset = book_list[start_page:end_page]
  38. """
  39. django中有自带的分页器模块 但是书写起来很麻烦并且功能太简单
  40. 所以我们自己想法和设法的写自定义分页器
  41. 上述推导代码你无需掌握 只需要知道内部逻辑即可
  42. 我们基于上述的思路 已经封装好了我们自己的自定义分页器
  43. 之后需要使用直接拷贝即可
  44. """

作业

Django---进阶8的更多相关文章

  1. Python之路,Day16 - Django 进阶

    Python之路,Day16 - Django 进阶   本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...

  2. django进阶补充

    前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...

  3. django进阶-3

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  4. django进阶-4

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

  5. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  6. Django进阶知识

    drf学习之Django进阶点 一.Django migrations原理 1.makemigrattions: 相当于在每个app下的migrations文件夹下生成一个py脚本文件用于创建表或则修 ...

  7. django进阶-查询(适合GET4以上人群阅读)

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

  8. django进阶-modelform&admin action

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  9. django进阶-小实例

    前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...

  10. django进阶-1

    前言: 各位久等了,django进阶篇来了. 一.get与post 接口规范: url不能写动词,只能写名词 django默认只支持两种方式: get, post get是获取数据 ?user=zcl ...

随机推荐

  1. error: RPC failed; curl 18 transfer closed with outstanding read data remaining的解决

    解决方案也是网上搜的,总结一下 一,加大缓存区git config --global http.postBuffer 524288000这个大约是500M二.少clone一些,–depth 1git ...

  2. 描述一下 JVM 加载 class 文 件的原理机制?

    JVM 中类的装载是由 ClassLoader 和它的子类来实现的, Java ClassLoader 是一个重要的 Java 运行时系统组件.它负责在运行时查找和装入类文件的类.

  3. win系统DOS批处理命令:每日根据定时计划,弹出相应的提醒

    @echo off setlocal enabledelayedexpansion ::设置数据源 ::set DATASET=D:\soft\xinyu\xinyu.txt ::获取系统时间的星期值 ...

  4. MSCHART控件中长字符的X轴坐标标注全部显示

    X轴坐标如果超过9位的话,就不能完全显示了,就会一个隔一个的显示,解决的办法: Chart1.ChartAreas[].AxisX.Interval = ; //设置X轴坐标的间隔为1 Chart1. ...

  5. c常用函数-atoi 和 itoa

    atoi 和 itoa atoi的功能是把一个字符串转为整数 Action(){ int j; char *s=""; j = atoi(s); lr_output_message ...

  6. jsc和luac文件 xxtea 解密.

    # -*- coding: utf-8 -*- import xxtea import os src = "./assets/src" dst = "./assets/s ...

  7. 第二章、Web中使用shiro(实现登陆)

    虽然Apache Shiro的核心设计目标允许它用于保护任何基于JVM的应用程序(如命令行应用程序,服务器守护程序,Web应用程序等),但本指南将着重讨论最常见的用例:确保运行的Web应用程序一个Se ...

  8. [ 头皮发麻 A1 ] 队内赛3 2020 Ateneo de Manila University DISCS PrO HS Division

    都是英语阅读题 但是本菜鸡就过了一题,直接自闭mmp明天开始起床一版题 传送门 B.Riana and the Blind Date 0是闰年?惊了 后来才知道整除被除数可以为0 闰年的计算方法 \( ...

  9. [ C++ ] 勿在浮沙筑高台 —— 内存管理(18~31p) std::alloc

    部分内容个人感觉不是特别重要,所以没有记录了.其实还是懒 embedded pointers 把对象的前四字节当指针用. struct obj{ struct obj *free_list_link; ...

  10. 尚硅谷 dubbo学习视频

    1 1.搭建zookpeer注册中心 windows下载zooker  需要修改下zoo_sample .cfg为zoo.cnf 然后需要zoo.cnf中数据文件的路径 第五步:把zoo_sample ...