14ajax引入

【一】ajax简介

"""页面不刷新的情况下可以与后端进行数据交互
    异步提交 局部刷新
    使用ajax交互 所有的操作都不再直接影响整个页面(局部操作)
eg:注册时输入框你在写一个用户名时,他会实时告诉你是否已存在"""
    ajax不是一门全新知识 本质就是一些js代码 我们学习ajax直接使用jQuery封装之后的版本(语法更加简单)   使用ajax的前提必须要引入jQuery文件
"""基本语法"""    
   页面上有三个input框和一个提交按钮 前两个框输入数字 点击按钮 最后一个框里面展示数字的和 并且页面不能刷新
  $('#btn').click(function () {
            // 获取两个框里面的数据
            let i1Val = $('#i1').val();
            let i2Val = $('#i2').val();
            // 发送ajax请求传输数据
            $.ajax({
                url:'',  // 不写默认就是当前页面所在的地址
                type:'post', // 指定当前请求方式
                data:{'i1':i1Val,'i2':i2Val},  // 请求携带的数据
                success:function (args) {  // 异步回调函数 后端有回复自动触发
                    $('#i3').val(args)
                }
            })
        }) 
    
    
    后端request.is_ajax()获取有没有判断是不是ajax请求

【二】前后端传输数据编码格式

(1)普通版把数值传过来
1.前端
 
$.ajax(
                {
                    //url后面跟的是你这个ajax提交数据的路径,向谁提交,不写就是向当前路径提交
                    url: "",
                    //type为标定你这个ajax请求的方法
                    type: "post",
                    //data后面跟的就是你提交给后端的数据
                    data: {numberOne: numberOne, numberTwo: numberTwo},
                    //success为回调函数,参数data即后端给你返回的数据
                    success: function (data) {
                        // 注意:data 表示返回的数据。
                        console.log(data)
                        //  注意:result.val(data) 表示将返回的数据赋值给 id 为 result 的元素的 value 属性。
                        result.val(data)
                    }
                }
            )
    
   
2.后端
def add_number(request):
    if request.method == "POST":
        data = request.POST
        #  获取前端传递的参数
        # <QueryDict: {'numberOne': ['1'], 'numberTwo': ['2']}>
        number_one = data.get("numberOne")
        number_two = data.get("numberTwo")
        # 计算结果 : 注意从前端取出来的数字是字符串类型,需要做类型转换才能运算
        result = int(number_one) + int(number_two)
        # 返回响应数据
        return HttpResponse(result)
    return render(request, "index.html")
(2)升级版利用json的dumps打包好用HttpResponse传输
1.前端
 
    $("#btn_result").click(function () {
            let numberOne = $("#numberOne").val();
            let numberTwo = $("#numberTwo").val();
            let result = $("#numberResult")
            $.ajax(
                {
                    url: "",
                    type: "post",
                    data: {numberOne: numberOne, numberTwo: numberTwo},
                    // 前端反序列化数据 方式一
                    // 在Ajax上加参数
                    // dataType 参数应该是一个字符串,表示期望从服务器返回的数据类型(如 "json", "xml", "script", "html" 等)
                    dataType: "json",//指定了格式所以可以用点来取值
                    success: function (data) {
                        console.log(data)
                        result.val(data.result)
                    }
                }
            )
        })
2.后端
def add_number(request):
    if request.method == "POST":
        data = request.POST
        number_one = data.get("numberOne")
        number_two = data.get("numberTwo")
        result = int(number_one) + int(number_two)
        result = {
            "message": "success",
            "result": result
        }
        return HttpResponse(json.dumps(result))
    return render(request, "index.html")
(3)进阶版(JsonResponse)
1.后端
def add_number(request):
    if request.method == "POST":
        data = request.POST
        #  获取前端传递的参数
        # <QueryDict: {'numberOne': ['1'], 'numberTwo': ['2']}>
        number_one = data.get("numberOne")
        number_two = data.get("numberTwo")
        # 计算结果 : 注意从前端取出来的数字是字符串类型,需要做类型转换才能运算
        result = int(number_one) + int(number_two)
        result = {
            "message": "success",
            "result": result
        }
        # 返回响应数据 - 使用JsonResponse对象序列化成json字符串
        return JsonResponse(result)
    return render(request, "index.html")
(4)form表单
"""
请求体中携带编码格式
    Content-Type:...
django针对不同编码方式对应的数据格式会采用不同的处理策略
"""
form表单默认发送的编码格式
    Content-Type: application/x-www-form-urlencoded
  数据格式:username=jason&password=123
  django后端会自动处理到:request.POST
form表单发送文件
    Content-Type: multipart/form-data
  数据格式:隐藏不让看
  django后端会自动处理:request.POST  request.FILES
ajax默认的编码格式
    Content-Type: application/x-www-form-urlencoded
  数据格式:username=jason&password=123
  django后端会自动处理到:request.POST

【三】ajax发送json格式数据

# form表单是无法发送json格式数据的!!!
ajax发送的数据类型一定要跟数据的编码格式一致 
    不能骗人家:
    编码格式是urlencoded 
    数据格式就应该是username=jason&password=123
    但是你却发送了json格式数据
"""
django后端真多json格式的数据不会做任何的处理 就在request.body内
需要我们自行处理
"""
1.前端
 
$('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',  // 不写默认也是get请求
            contentType:'application/json',  // 不写默认是urlencoded编码
            data:JSON.stringify({'name':'jason','pwd':123}),  // 序列化方法
            success:function (args) {
            }
        })
    })

2.后端
def ab_json(request):
    print(request.is_ajax())  # True
    if request.method == 'POST':
        print(request.POST)  # <QueryDict: {}>
​
    print(request.body)  # 返回的是二进制数据 :b'{"username":"dream","password":521521}'
    # 针对JSON格式的数据需要自己手动处理
    json_bytes = request.body
​
    # (1)方式一:先解码 再转换数据格式
    json_str = json_bytes.decode('utf-8')
    json_dict = json.loads(json_str)
    print(json_dict, type(json_dict))  # {'username': 'dream', 'password': 521521} <class 'dict'>
​
    # (2)方式二:json.loads(二进制数据) 内部可以自动解码再反序列化
    json_dict_loads = json.loads(json_bytes)
    print(json_dict_loads, type(json_dict_loads))  # {'username': 'dream', 'password': 521521} <class 'dict'>
​
​
    return render(request, 'ab_json.html')

【四】ajax携带文件数据

"""利用FormData()对象,把数据append进去"""
1.前端
 
// 点击按钮向后端发送普通键值对数据和文件数据
$("#btn").on('click', function () {
    // (1)先生成一个内置对象
    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里面即可
    data: formDataObj,
​
    // Ajax发送文件必须添加的两个参数
    // 不需要使用任何编码 -  Django后端能自动识别 formdata 对象
    contentType: false,
    // 告诉浏览器不要对我的数据进行任何处理
    processData: false,
//浏览器不要对数据进行处理
    success: function (args) {
​
    }
})
    
    2.后端
 
  print('POST::>>', request.POST)
# 普通键值对放在了  request.POST   中
# POST::>> <QueryDict: {'username': ['dream'], 'password': ['666']}>
​
print('FILES::>>', request.FILES)
# 文件数据放在了  request.FILES   中
# FILES::>> <MultiValueDict: {'myfile': [<InMemoryUploadedFile: img.png (image/png)>]}>

【五】sweetalert和layui

【六】Django框架之序列化组件serializers

"""
以后我们用的序列化组件是DRF 这里学自带的是提前瞜一眼效果
"""
"""对模型表中的数据进行序列化"""
from app01 import models
from django.http import JsonResponse
from django.core import serializers
def d_data(request):
    # 前后端分离之后 django orm产生的queryset无法直接被前端识别 还是需要json格式数据(硬通货)
    # data_list = []  # [{}, {}, {}]
    # user_queryset = models.User.objects.all()
    # for user_obj in user_queryset:
    #     data_list.append({
    #         'pk':user_obj.pk,
    #         'name':user_obj.name,
    #         'age':user_obj.age,
    #         'gender':user_obj.gender,
    #         'gender_real':user_obj.get_gender_display(),
    #         'addr':user_obj.addr
    #     })
    # return JsonResponse(data_list,safe=False)
    user_queryset = models.User.objects.all()
    ret = serializers.serialize('json', user_queryset)
    return HttpResponse(ret)

【七】批量数据操作

def many_data(request):
    # 循环插入10万条数据(频繁走数据库操作 效率极低 不推荐!!!)
    # for i in range(100000):
    #     models.Book.objects.create(title=f'第{i}本书')
    '''批量插入'''
    book_list = []
    for i in range(100000):
        # 先用类产生一个对象
        source_book_obj = models.Books(title=f'第{i}本书')
        # 将对象追加到列表中
        book_list.append(source_book_obj)
    models.Books.objects.bulk_create(book_list)  # 批量插入
    book_queryset = models.Books.objects.all()
    return render(request,'many_data.html',locals())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值