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

提交post请求的两种方式:

  • form表单
  • ajax请求

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

  • urlencoded
  • formdata(form表单里的)
  • jaon

研究form表单

默认的数据编码格式是urlencoded
数据格式:username=jason&password=123

当提交方式改为enctype="multipart/form-data"后

总结

urlencoded编码格式

django后端针对符合urlencoded编码格式的数据会自动帮你解析封装到request.POST中
eg: username=jason&password=123 >>> request.POST

formdata编码格式

针对普通的键值对还是解析到request.POST中,而将文件解析到request.FILES中

json

form表单不支持发送json数据

研究ajax

默认的编码格式是urlencoded
数据格式:username=jason&age=20

总结

django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中
username=jason&age=20 >>> request.POST

ajax发送json格式数据

注意事项

1.contentType参数指定成: application/json

2.数据必须是json数据,不是要用JSON.stringify转成json格式

3.django后端要用request.body获取并处理而不是用request.POST

4.reuqest.is_ajax()是判断当前请求是否是ajax请求,返回布尔值

前端ajax

<script>
$('#d1').click(function (){
$.ajax({
url:'', # 朝哪发数据
type:'post', # 指定请求方式
contentType:'application/json', # 指定编码格式
data:JSON.stringify({'username': 'jason', 'pwd': 123}), # 序列化成json格式
success:function (args){ }
})
})
</script>

后端接收数据

    if request.is_ajax():
if request.method == 'POST':
dic_json = request.body # body接收的数据是二进制格式
dic = json.loads(dic_json) # json特点:自动解码并且反序列化(可以减少一步操作)
print(dic)

ajax发送文件

条件: ajax发送文件需要借助于js内置对象FormData

前端ajax

<p>username:<input type="text" id="d1"></p>
<p>password:<input type="text" id="d2"></p>
<p>file: <input type="file" id="d3"></p>
<button class="btn btn-primary" id="d4">点我</button> <script>
$('#d4').on('click', function (){
// 1.需要先利用FormData内置对象
let formDataObj = new FormData()
// 2.添加普通键值对
formDataObj.append('username', $('#d1').val())
formDataObj.append('password', $('#d2').val())
// 3.添加文件对象
formDataObj.append('myfile', $('#d3')[0].files[0])
// 4.将对象基于ajax发送给后端
$.ajax({
url:'',
type:'post',
data:formDataObj, // 直接将对象放在data后面即可
// 5.ajax发送文件必须要指定两个参数
contentType:false, // 告诉浏览器不要修改提交的数据格式
processData:false, // 告诉浏览器不要对提交的数据进行任何的更改
success:function (args){
}
})
})
</script>

后端接收文件

def file(request):
if request.method == 'POST':
print(request.POST)
print(request.FILES)
file_obj = request.FILES.get('myfile')
print(file_obj.name)
return render(request, 'file.html')

django自带的序列化组件

在前后分离的项目中,不能使用模板语法,只能用过json格式来实现数据的交互,一般数据的组成都是列表套字典

手动

def drf(request):
from django.http import JsonResponse
user_queryset_list = models.User.objects.all()
# 不用组件手动的添加字典
user_list = []
for user_obj in user_queryset_list:
temp = {
'pk': user_obj.pk,
'username': user_obj.username,
'age': user_obj.age,
'sex': user_obj.get_sex_display(),
}
user_list.append(temp)
return JsonResponse(user_list, safe=False, json_dumps_params={'ensure_ascii': False})

组件序列化

def drf(request):
from django.http import JsonResponse
from django.core import serializers
user_queryset_list = models.User.objects.all()
# 序列化
res = serializers.serialize('json', user_queryset_list) # 指定json格式 然后传入数据
return JsonResponse(res, safe=False)
"""会自动帮你将数据变成json格式的字符串 并且内部非常的全面""" 前后端分离的项目
作为后端开发的你只需要写代码将数据处理好
能够序列化返回给前端即可
再写一个接口文档 告诉前端每个字段代表的意思即可 写接口就是利用序列化组件渲染数据然后写一个接口文档 该交代交代一下就完事

ajax结合sweetalert做弹窗效果

前端

"""
自己要学会如何拷贝
学会基于别人的基础之上做修改
研究各个参数表示的意思 然后找葫芦画瓢
"""
下面style是为了处理一些显示BUG
<style>
div.sweetalert h2 {
padding-top: 10px;
}
</style> <script>
$('.del').on('click',function () {
// 先将当前标签对象存储起来
let currentBtn = $(this);
// 二次确认弹框
swal({
title: "你确定要删吗?",
text: "你可要考虑清除哦,可能需要拎包跑路哦!",
type: "warning",
showCancelButton: true,
confirmButtonClass: "btn-danger",
confirmButtonText: "是的,老子就要删!",
cancelButtonText: "算了,算了!",
closeOnConfirm: false,
closeOnCancel: false,
showLoaderOnConfirm: true
},
function(isConfirm) {
if (isConfirm) {
// 朝后端发送ajax请求删除数据之后 再弹下面的提示框
$.ajax({
{#url:'/delete/user/' + currentBtn.attr('delete_id'), // 1 传递主键值方式1#}
url:'/delete/user/', // 2 放在请求体里面
type:'post',
data:{'delete_id':currentBtn.attr('delete_id')},
success:function (args) { // args = {'code':'','msg':''}
// 判断响应状态码 然后做不同的处理
if(args.code === 1000){
swal("删了!", args.msg, "success");
// 1.lowb版本 直接刷新当前页面
{#window.location.reload()#}
// 2.利用DOM操作 动态刷新
currentBtn.parent().parent().remove()
}else{
swal('完了','出现了位置的错误','info')
}
} }) } else {
swal("怂逼", "不要说我认识你", "error");
}
});
}) </script>

后端

def delete(request):
user_list = models.User.objects.filter(is_delete=0)
if request.is_ajax():
if request.method == 'POST':
del_id = request.POST.get('id')
models.User.objects.filter(pk=del_id).update(is_delete=1)
back_dic = {'status': 200, 'msg': '删除成功'}
return JsonResponse(back_dic)
return render(request, 'delete.html', locals())

这是显示的BUG,按最上面的style改一下就好

最终版

总结

1.以后要获取标签内的属性可以通过自定义的方式,不要局限于标签固有的属性
用jqery对象.attr(属性名) 就可以获得到对应的属性值
如果是获取input框用户输入的数据 就用jqery对象.val()
2.还有一个设置点击事件的方法就是在标签内部定义
eg: <button onclick="del(可以传参)">删除</button>
然后在<script> function del(参数){...} </script>
3.标签的id是不可重复的,可以用拼接的方式使id不重复
eg: <a onclick="del({{ user_obj.id }})" id="btn_{{ user_obj.id }}">删除</a>
获取标签对象可以用拼接来获取
<script>
function del(id){
$('#btn_' + id ) // 这样也是可以的 等价于 $('#btn_1') 、$('#btn_2')...
}
</script>

批量插入

格式: bulk_create

普通插入数据

def ab_pl(request):
先给Book插入一万条数据
for i in range(10000):
models.Book.objects.create(title='第%s本书'%i)
# 再将所有的数据查询并展示到前端页面
book_queryset = models.Book.objects.all()
return render(request,'ab_pl.html',locals()) # 很慢 响应时间大概10s左右 还只是10000条数据

批量插入

批量插入
book_list = []
for i in range(100000):
book_obj = models.Book(title='第%s本书' % i)
book_list.append(book_obj)
models.Book.objects.bulk_create(book_list) # 批量插入数据 使用列表套对象
return render(request,'ab_pl.html',locals()) # 用时3s 而且数据还是100000条

Django中数据传输编码格式、ajax发送json数据、ajax发送文件、django序列化组件、ajax结合sweetalert做二次弹窗、批量增加数据的更多相关文章

  1. Django中简单添加HTML、css、js等文件(非正规添加,适合小白)

    Django中简单添加HTML.css.js等文件 首先申明下自己的环境, python版本3.65(亲测3.7版本有毒,没解决掉!) Django版本1.11.15(版本比较成熟,也可以用最新的版本 ...

  2. Django 中 a href标签 使用方法 跳转页面(Django四)

    上次我已经用Django启动了一个登录模板页面 具体过程见:Django启动我的第一个模板页面 但问题是我们只能通过监听的端口访问这一个页面,不能通过页面的一些连接跳转到其他页面如下,我们不能点击注册 ...

  3. Vue-cli3 中 通过在index.html添加的script js文件 如何在组件内使用不会 xxx is not defined错误

    以jQuery 为例 第一种方法 更改webpack配置信息 1.在vue.config.js中(如果没有 请在根目录新建)配置如下信息 // const webpack = require('web ...

  4. 使用弹窗批量修改数据POPUP_GET_VALUES

    转自:https://blog.csdn.net/huanglin6/article/details/81231215 业务场景:在SAP内,有时候需要用户批量维护某些数据,这时候可以使用标准函数PO ...

  5. ajax发送json格式与文件数据、django自带的序列化器(了解)

    上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...

  6. Query通过Ajax向PHP服务端发送请求并返回JSON数据

    Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...

  7. jQuery通过Ajax向PHP服务端发送请求并返回JSON数据

    SON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教 ...

  8. Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

    目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...

  9. django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件

    目录 一.ajax结合sweetalter 二.bulk_create批量插入数据 三.简易版分页器推导 1. 推导步骤 四.自定义分页器的使用 1. 自定义分页器模板 2. 使用方法 (1)后端代码 ...

随机推荐

  1. BadImageFormatException异常

    访问页面时,抛出BadImageFormatException异常: 1.如果您的应用程序使用了 32 位组件,请确保该应用程序始终采用 32 位应用程序的运行方式. 如果应用程序项目的"平 ...

  2. ADT环境搭建手册

    前言 笔者在搭建ADT环境之前一脸懵逼,甚至不知道ADT是什么,更别说与之相关的SDK.eclipse等,相信很多小伙伴跟我一样也是一脸茫然,所以在搭建环境之前有必要先了解一下它们是什么,有什么样的关 ...

  3. 使用systemd-analyze 工具来分析各个服务进程的启动性能

    systemd-analyze是一个分析启动性能的工具,用于分析启动时服务时间消耗.默认显示启动是内核和用户空间的消耗时间:使用systemd-analyze plot > boot.svg生成 ...

  4. kdump原理,是如何找到入口的

    请解释下kdump原理,捕获内核是如何获取到生产内核的首地址的.

  5. Cobalt Strike的安装

    一.下载 压缩包下载回来之后,可以看到里面的文件有这些: 其中搭建团队服务器端的关键文件有两个,一个是cobaltstrike.jar,另一个是teamserver,这里我打算将团队服务器端搭在我的v ...

  6. python 常用模块函数使用

    1.collections模块在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict ...

  7. vue集成ckeditor富文本框,怎么获取CKEditor实例?

    CKEDITOR 版本5 ,vue集成形式 vue集成ckeditor富文本框,由于不是通过js创建的富文本对象,所以,无法取得实例对象,官方说明 官方在builds-->Getting and ...

  8. 使用 Redis 有哪些好处?

    1.速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查 找和操作的时间复杂度都是 O1) 2.支持丰富数据类型,支持 string,list,set,Zset,hash ...

  9. TCP 重传、滑动窗⼝、流量控制、拥塞控制

    重传机制 TCP 会在以下两种情况发⽣超时重传: 数据包丢失 确认应答丢失 重传超时 重传超时是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果 ...

  10. 运筹学之"概率"和"累计概率"和"谁随机数"

    概率 = 2/50 = 0.2 累计概率 = 上个概率加本次概率 案例1 概率=销量天数 / 天数 = 2 /100 = 0.02 累计概率 = 上个概率加本次概率 = 0.02 +0.03 = 0. ...