ajax向后端发送

创建表的时候字段常见的参数

choices参数的使用

应用场景:
学历:
	小学 初中 高中 本科 硕士 博士   1 2 3 4 5 6
    
客户来源:
    微信渠道 广告 介绍 QQ 等等
    
性别:
	男 女  未知
"""对于以上可能被我们列举完的字段我们一般都是选择使用choices参来做"""
class UserInfo(models.Model):
    username = models.CharField(max_length=64)
    password = models.CharField(max_length=32)

    # 先写一个映射关系,每对映射用一个个元组表示
    gender_choices = (
        (1, '男'),
        (2, '女'),
        (3, '未知'),
    )
    """字段存储的范围还是取决于数据类型的字段"""
    gender = models.SmallIntegerField(choices=gender_choices) # 男 女 未知 1 2 3 4

  
    
    res=models.UserInfo.objects.filter(pk=4).first()
    print(res.gender) # 1
    # get_字段名_display()
    # 如果你存储的数据没有在映射范围内,就原样输出,如果有,就显示对应的关系对应的数据
    print(res.get_score_display())

数据传递和格式详解

前端的请求发送到django后都会被封装到HttpRequest对象中,而该对象下有一个非常重要的属性
HttpRequest.body,即请求体

"""
可以发送网络请求的标签
	a标签			GET请求
	form表单		GET请求 POST请求
	
	ajax技术		GET请求 POST请求
	 ajax默认的数据格式为urlencoded
	该格式数据:i1=123213&i2=12313
     针对该类型的数据:django会自动处理到request.POST中
    ajax 传递json格式的数据的时候,在后端需要用request.body接收"""
   form表单默认的数据格式也是urlencoded
	该格式数据:i1=123213&i2=12313
     针对该类型的数据:django会自动处理到request.POST中
	form表单还可以发送数据格式为formdata
    针对该类型的数据:普通的数据还是解析到request.POST中 文件类型的数据解析到request.FILES中

# 一 当请求方法为GET
当浏览器基于http协议的GET方法提交数据时,没有请求体一说,
数据会按照k1=v1&k2=v2&k3=v3的格式放到url中,
然后发送给django,django会将这些数据封装到request.GET中,
注意此时的请求体request.body为空、无用

# 二 当请求方法为POST时
当浏览器基于http协议的POST方法提交数据时,数据会放在请求体内,然后发送给django
django会将接收到的请求体数据存放于HttpRequest.body属性中.
但该属性的值为Bytes类型(套接字数据传输都是bytes类型),
而通常情况下直接处理Bytes、并从中提取有用数据的操作是复杂而繁琐的,
好在django会对它做进一步的处理与封装以便我们更为方便地提取数据,
具体如何处理呢?
  
当前端采用POST提交数据时,form表单可以通过属性enctype进行设置编码格,如下
编码格式1(默认的编码格式):enctype="application/x-www-form-urlencoded" 
编码格式2(使用form表单上传文件时只能用该编码):enctype="multipart/form-data"
数据有三种常用编码格式,编码格式不同Django会有不同的处理方式
  # 编码格式1:application/x-www-form-urlencoded,是form表单默认编码格式,用来上传数据
  # 编码格式2:multipart/form-data,上传文件专用格式,也可以用来传数据
  # 编码格式2:application/json,提交jason格式字符串

  #====》POST请求体数据的编码格式1:application/x-www-form-urlencoded时《====
      HttpRequest.body中的数据格式为b'a=1&b=2&c=3'
      django会将其提取出来封装到request.POST中
      request.FILES此时为空
        
      如:
      print(request.body) # b'a=1&b=2&c=3'
      print(request.POST) # <QueryDict: {'a': ['1'],'b': ['2'],'c': ['3']}
      print(request.FILES) # <MultiValueDict: {}>

        
  #====》POST请求体数据的编码格式2:multipart/form-data时《====      
      HttpRequest.body中的数据格式为b'------WebKitFormBoundaryKtcwuksQltpNprep\r\nContent-Disposition: form-data;......',注意,文件部分数据是流数据,所以不在浏览器中显示是正常的
      django会将request.body中的非文件数据部分提取出来封装到request.POST中
      将上传的文件部分数据专门提取出来封装到request.FILES属性中
     
      如:
      print(request.body) # 不要打印它,打印则报错,因为它是数据流
      print(request.POST) # <QueryDict: {'a': ['1'],'b': ['2'],'c': ['3']}
      print(request.FILES) # <MultiValueDict: {'head_img': [<InMemoryUploadedFile: 11111.jpg (image/jpeg)>]}>

      强调:
        1、毫无疑问,编码格式2的数据量要大于编码格式1,如果无需上传文件,还是推荐使用更为精简的编码格式1
    	2、FILES will only contain data if the request method was POST and the <form> that posted to the request had enctype="multipart/form-data". Otherwise, FILES will be a blank dictionary-like object.
        
  #===》POST请求体数据的编码格式3:application/json时《====
      "此时在django后台,request.POST和request.FILES中是没有值的,都放到request.body中了,需要用json.loads对其进行反序列化"
        
      如:
      print(request.body) # b'{"a":1,"b":2,"c":3}'
	  print(request.POST) # <QueryDict: {}>
	  print(request.FILES) # <MultiValueDict: {}>
        
  
# 如何设定POST提交数据的编码格式 
    前端往后台POST提交数据,常用技术有form表单和ajax两种
    form表单可以设置的数据编码格式有:编码格式1、编码格式2
    ajax可以设置的数据编码格式有:编码格式1、编码格式2、编码格式3
    
 

ajax语法

python中序列化反序列化
	import json
	json.dumps()
	json.loads()
Js中序列化反序列化
	JSON.stringify()
	JSON.parse()

无感传输,该技术主要用来向后端发送数据
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新
1. 异步提交
2. 局部刷新

 ajax默认的数据格式为urlencoded,还可以是json
# 基本语法格式
$.ajax({
    url:'',
    type:'post',  // 不写该参数 默认是get请求
    data:JSON.stringify({'username':'jason','pwd':123}),
    contentType:'application/json'
    success:function (args) { #// 回调函数用来接收后端返回的数据
        alert(args)
    }
})

如果设置了'dataType'"""前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式,所以要用jsonresponse 和Httpresponse 两种方式返回数据)"""
当后端采用HttpResponse返回json格式数据到ajax异步回调函数默认情况下需要我们自己做反序列化JSON.parse如果不想自己处理可以添加dataType:"JSON"
如果后端是采用JsonResponse返回json格式数据则无需我们自己处理也不需要添加
dataType:"JSON"参数(加了也不影响)
# 以后推荐加上 增加程序兼容性

'contentType':json 告诉后端,前端传输的是json格式的数据,那么,在前端发送的时候就需要序列化在发送,后端接收的数据就需要在request.body里接收
    
当'processData': true的时候,jquery会序列化数据。当processData: false的时候,jquery不会对数据进行处理,默认是true,所以在上传文件的时候,要设置为flase,不对数据格式做任何处理

ajax发送文件

$('#b1').click(function () {
        // ajax发送携带文件数据的请求 需要借助于内置对象FormData
        // 1.先生成一个FormData对象
        let formDataObj = new FormData();
        // 2.往该对象中添加数据(支持普通数据和文件数据)
        formDataObj.append('name',$('#i2').val());
        formDataObj.append('pwd',$('#i3').val());
        //" 获取文件数据 有固定的语法格式"
        formDataObj.append('file',$('#i1')[0].files[0]);
        // 发送ajax请求
        $.ajax({
            url:"/ab_file/",
            type:'post',
            // 发送文件需要额外配置的两个参数
           " contentType:false, 表示前端对数据格式不做任何处理
            "processData: false,""  告诉jequery,对数据格式不做任何处理
            data:formDataObj,
            success:function (res) {
                针对res的一系列操作,这个res代表后端返回的全部结果,叫啥都无所谓,只要和function里面的参数一样就可以
            }
        })
    })

序列化模块

所谓序列化模块就是将列表套字典形式的数据一次性转成json数据格式

from django.core import serializers
def ab_ser(request):
    data = models.Books.objects.all()
    # new_list = []
    # for obj in data:  # 数据对象
    #     temp_dict = {}
    #     temp_dict['table'] = 'app01.Books'
    #     temp_dict['pk'] = obj.pk
    #     temp_dict['title'] = obj.title
    #     temp_dict['price'] = obj.price
    #     temp_dict['publish_name'] = obj.publish_name
    #     new_list.append(temp_dict)
    # return JsonResponse(new_list, safe=False)
    # 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
    ret = serializers.serialize('json', data)  # DRF的前身
    return HttpResponse(ret)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值