Django环境下使用Ajax

news2024/12/23 12:29:24

Django环境下使用Ajax

目录

  • Django环境下使用Ajax
    • 介绍
    • 前情提要
    • 示例
        • JS实现
        • Ajax实现
    • 传递JSON格式数据
    • 传递文件数据
    • Django自带的序列化组件
      • 基于jsonresponse序列化数据
      • 基于Django自带的serializers
    • 注册示例

介绍

AJAX 的主要目标是在不刷新整个页面的情况下,通过后台与服务器进行数据交换和更新页面内容。通过 AJAX,您可以向服务器发送请求并接收响应,然后使用 JavaScript 动态地更新页面的部分内容

简单来说就是将后端数据进行加工后传给前端,再利用js对数据进行加工或判断后渲染到前端

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行,AJAX 使用异步交互与服务器进行通信

  • 同步交互:
    • 客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:
    • 客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

前情提要

常见的发送请求方式:

  1. 浏览器地址直接输入url回车
    • GET请求
  2. a标签的href属性
    • GET请求/POST请求
  3. form表单
    • GET请求/POST请求
  4. Ajax
    • GET请求/POST请求

示例

预期效果

image-20240309195930986

JS实现
<body>
<input type="text" id="num1">+
<input type="text" id="num2">=<input type="text" id="num3"><br>
<button id="b1">点我计算结果</button>

<script>
    document.getElementById('b1').addEventListener('click', function () {
        var num1 = document.getElementById('num1').value
        var num2 = document.getElementById('num2').value
        var sum = parseInt(num1) + parseInt(num2)
        document.getElementById('num3').value = sum
    })
</script>
</body>
Ajax实现

将要计算的参数通过data传递给后端

再由success接受后端返回的数据进行渲染

<body>
<input type="text" id="num1">+
<input type="text" id="num2">=<input type="text" id="num3"><br>
<button id="b1">点我计算结果</button>

<script>
    document.getElementById('b1').addEventListener('click', function () {
        var num1 = document.getElementById('num1').value
        var num2 = document.getElementById('num2').value
        $.ajax({
            {#url:指定当前数据提交的网址,如果不写就和form表单的action一样,默认释放前路由地址#}
            url:'',
            {#type:请求类型 GET / POST 默认是GET#}
            type:'post',
            {#data:传给后端的数据#}
            data:{
                'num1':num1,
                'num2':num2,
            },
            {#success:回调函数 接受后端传过来的数据#}
            success:function (data){
                console.log(data)
                document.getElementById('num3').value = data
            }
        })
    })
</script>
</body>

后端接受到data数据并返回sum参数

def test(request):
    if request.method == 'POST':
        data = request.POST
        num1 = data.get('num1')
        num2 = data.get('num2')
        sum = int(num1) + int(num2)
        return HttpResponse(sum)
    return render(request, 'app01/test.html', locals())

传递JSON格式数据

success获取由后端返回的数据并使用JSON.parse(data)进行数据转换,这样便可以直接用.属性获取参数
JSON.stringify:ajax中将需要传递的数据转换成json类型
json.loads(request.body.decode()):后端接受数据时需要通过request.body来获取请求体,然后loads手动解析json数据

<body>
<input type="text" id="num1">+
<input type="text" id="num2">=<input type="text" id="num3"><br>
<button id="b1">点我计算结果</button>

<script>
    document.getElementById('b1').addEventListener('click', function () {
        var num1 = document.getElementById('num1').value
        var num2 = document.getElementById('num2').value
        $.ajax({
            {#url:指定当前数据提交的网址,如果不写就和form表单的action一样,默认释放前路由地址#}
            url: '',
            {#type:请求类型 GET / POST 默认是GET#}
            type: 'post',
            {#data:以json格式传递给后端数据#}
            data: JSON.stringify({
                'num1': num1,
                'num2': num2,
            }),
            {#success:回调函数 接受后端传过来的数据#}
            success: function (data) {
                var new_data = JSON.parse(data)
                if (new_data.code != 200) {
                    alert('非法数据')
                } else {
                    console.log(data)
                    document.getElementById('num3').value = new_data.sum
                }
            }
        })
    })
</script>
</body>

接受数据并返回json格式数据(主力这里回调函数用的是data.参数)

def test(request):
    if request.method == 'POST':
    	# 提取json数据必须通过request.body获取请求体 并手动解析 JSON 数据
        data = json.loads(request.body.decode())
        num1 = data.get('num1')
        num2 = data.get('num2')
        sum = int(num1) + int(num2)
        # HttpResponse发送给前端的是str对象 需要在success重新转换类型
        return HttpResponse(json.dumps({'code':200,'sum':sum}))
    return render(request, 'app01/test.html', locals())

传递文件数据

<script>

    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            let fileVal = $("#file_input")[0].files[0];
            // Ajax携带文件数据需要借助第三方的 formData对象
            // (1)实例化得到一个 form对象
            // 将所有的键值对数据都要放到 form对象中
            let formDataObj = new FormData();
            formDataObj.append("numberOne", numberOne)
            formDataObj.append("numberTwo", numberTwo)
            formDataObj.append("file", fileVal)
            console.log(fileVal)
            console.log(formDataObj)
            // 基于Ajax发送请求
            $.ajax({
                // url:指定当前数据提交的网址,如果不写就和form表单的action一样,默认释放前路由地址
                url: "",

                // type:请求类型 GET / POST 默认是GET
                type: "post",

                // data:传给后端的数据
                //(1)传输的data直接放上面的 form对象即可
                data: formDataObj,

                //(2)走form对象不能让他使用编码对数据进行编码
                contentType: false, // 默认编码是 urlencoded

                //(3)告诉浏览器不要对数据进行额外的处理
                processData: false,

                {#data: {'number_one': numberOne, "number_two": numberTwo},#}
                // success:回调函数 接受后端传过来的数据
                success: function (data) {
                    console.log(data)
                    console.log(typeof (data))
                    // 使用 js自己的序列化方法序列化数据
                    {#let dataVal = JSON.parse(data)#}
                    console.log(typeof (data))
                    if (data.code === 200) {
                        $("#result").val(data.result)
                    } else {
                        alert("非法的数据")
                    }
                }
            })
        })
    )
</script>
def test(request):
    if request.method == "POST":
        # 可以用来判断当前的请求方式是否是Ajax
        print(request.is_ajax()) # True
        # print(type(request.body.decode("utf-8")[0]))
        # 获取普通的键值对数据只需要通过 POST方法
        data = request.POST
        print(data)  # <QueryDict: {'numberOne': ['2'], 'numberTwo': ['2']}>
        # 获取form对象中的文件数据也要借助 FILES
        print(request.FILES)  # <MultiValueDict: {'file': [<InMemoryUploadedFile: avatar.jpg (image/jpeg)>]}>
        return JsonResponse({"code": 200, "result": "ok"})
    return render(request, "app01/test.html", locals())

Django自带的序列化组件

什么是序列化?

就是当我想要从数据库提取出数据后将数据对象转换为可以直接使用的数据的过程

基于jsonresponse序列化数据

from app01.models import User


def get_user(request):
    # 查询所有的用户数据
    user_data_list = []
    # 此时获取到的是对象数据<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>
    user_queryset = User.objects.all()
    # 将数据字段提取后装进列表
    for user_obj in user_queryset:
        user_data_list.append({
            "username": user_obj.username,
            "age": user_obj.age,
            "gender": user_obj.get_gender_display(),
        })
    print(user_data_list)
    # 将列表返回前端
    return JsonResponse(user_data_list,safe=False)
[{'username': 'drema', 'age': 18, 'gender': 'female'}, {'username': 'opp', 'age': 28, 'gender': 2}, {'username': 'hope', 'age': 38, 'gender': 'female'}]

基于Django自带的serializers

需要导入serializers模块

from app01 import models
from django.core import serializers

def test(request):
    author = models.Author.objects.all()
    author_list = serializers.serialize("json", author)
    print(author_list)
    return JsonResponse(user_data_list, safe=False)
[{"model": "app01.author", "pk": 1, "fields": {"name": "张三", "age": 11, "gender": 2}}, {"model": "app01.author", "pk": 2, "fields": {"name": "李四", "age": 19, "gender": 2}}]

注册示例

# 前端
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--    引入jQuery-->
    <script src="{% static 'js/jquery.js' %}"></script>

    <!--    引入Bootstrap的CSS文件-->
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">

    <!--    引入Bootstrap的JavaScript文件-->
    <script src="{% static 'js/bootstrap.js' %}"></script>
    <style>
        /* 左侧空白区域 */
        .left-section {
            background-color: dimgrey;
            width: 25%;
            height: 100vh;
            position: fixed;
            top: 0;
            left: 0;
        }

        /* 右侧空白区域 */
        .right-section {
            background-color: dimgrey;
            width: 25%;
            height: 100vh;
            position: fixed;
            top: 0;
            right: 0;
        }

        .d1 {
            position: fixed;
            left: 35%;
        }

        .form-control:focus {
            outline: none;
            box-shadow: 0 0 5px cornflowerblue;
        }

        .btn-default + .btn-primary {
            margin-left: 150px; /* 调整为所需的间距 */
        }
    </style>
</head>
<body>
<div class="left-section"></div>
<div class="right-section"></div>
<div class="d1">
{#    <form action="" method="post">#}
        <div class="form-group">
            <label for="username">用户名</label><br>
            <input type="text" class="form-control" id="username" placeholder="Username"><br>
            <hr>
        </div>
        <div class="form-group">
            <label for="pwd">密码</label><br>
            <input type="password" class="form-control" id="password" placeholder="Password"><br>
            <hr>
        </div>
        <div class="form-group">
            <label for="pwd2">再次输入密码</label><br>
            <input type="password" class="form-control" id="password2" placeholder="Password"><br>
        </div>

        <button type="reset" class="btn btn-default">重置</button>
        <button class="btn btn-primary" id="b1">确认</button>
{#    </form>#}
</div>

<script>
    var b1 = document.getElementById("b1")
    $(document).ready(function () {
        b1.addEventListener('click', function () {
            $.ajax({
                url: '',
                type: 'post',
                data: JSON.stringify({
                    'username': document.getElementById("username").value,
                    'password': document.getElementById("password").value,
                    'password2': document.getElementById("password2").value
                }),
                contentType: 'application/json',
                success: function (data) {
                    alert(JSON.parse(data.state))
                },
                error: () => {
                    console.log('错误')
                }
            })
        })
    })


</script>
</body>
</html>
# 后端
def register(request):

    if request.method == 'POST' and request.is_ajax():
        # data = request.POST
        data = json.loads(request.body.decode())
        print(data)
        username = data.get('username')
        password = data.get('password')
        print(username, password)
        # models.User.objects.create(username=username,password=password)
        state = {'state': 200}
        return JsonResponse(state)
    return render(request, 'app01/register.html')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

活动图高阶讲解-02

130 00:07:05,080 --> 00:07:06,680 这是历史 131 00:07:06,680 --> 00:07:11,400 那么在这个过程中 132 00:07:11,400 --> 00:07:14,840 就会出现多种变体了 133 00:07:14,840 --> 00:07:15,560 一个变体 134 00:07:15,560 --> 00:07:16,640 就是BPMN 135…

7.无重复字符的最长字串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

【包邮送书】Elasticsearch 通过索引阻塞实现数据保护深入解析

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

Learn OpenGL 07 摄像机

定义摄像机参数 glm::vec3 cameraPos glm::vec3(0.0f, 0.0f, 3.0f);//摄像机位置glm::vec3 cameraTarget glm::vec3(0.0f, 0.0f, 0.0f);glm::vec3 cameraDirection glm::normalize(cameraPos - cameraTarget);//摄像机方向&#xff0c;指向z轴正方向 glm::vec3 up glm::vec…

套接字编程 --- 三

目录 1. 前置性知识 1.1. listen 系统调用 1.2. accept 系统调用 1.3. 如何通信 1.3.1. read 系统调用 && write系统调用 1.3.2. recv 系统调用 && send 系统调用 2. TCP --- demo 2.1. Tcp_Server.hpp (version 1) 2.2. Tcp_Server.hpp (version 2…

[AIGC] Kafka解析:分区、消费者组与消费者的关系

Apache Kafka是一个分布式事件流平台&#xff0c;它是处理实时数据的强大工具。而理解Kafka的关键概念&#xff1a;分区&#xff08;Partition&#xff09;、消费者组&#xff08;Consumer Group&#xff09;和消费者&#xff08;Consumer&#xff09;的关系对于正确地使用Kafk…

C语言--- 指针运算笔试题详解

目录 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 题目7&#xff1a; 题目1&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);print…

C#与WPF通用类库

个人集成封装&#xff0c;仓库已公开 NetHelper 集成了一些常用的方法&#xff1b; 如通用的缓存静态操作类、常用的Wpf的ValueConverters、内置的委托类型、通用的反射加载dll操作类、Wpf的ViewModel、Command、Navigation、Messenger、部分常用UserControls(可绑定的Passwo…

蓝桥杯-ISBN号码

此题然让本人纠结了很久&#xff0c;真的好多坑。。。。果然还是太菜了。 完整代码以及思路解析(在注释中) #include <iostream> using namespace std; int main() {string num;cin>>num; int count0;int w1;for(int i0;i<10;i){if((i!1)&&(i!5)) //坑…

Node.js作用

Node.js可以开发应用 开发服务器应用 开发工具类应用 开发桌面端应用

Discord OAuth2授权以及机器人监听群事件

下面文章讲解获取OAuth2授权整个流程&#xff0c;创建机器人&#xff0c;使用机器人监听工会&#xff08;工会就是创建的服务器&#xff09;成员变化等等&#xff0c;对接国外的都是需要VPN的哦&#xff0c;对接的时候记得提前准备。 创建应用 点击 此页面添加应用,&#xff…

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GCN基于图卷积神经网络的数据分类预测 Matlab2023 2.多输入单输出的分类预测&#xf…

汽车电子:均胜电子、德赛西威“跑出”第二增长曲线

问界新M7上市以来销量势如破竹&#xff0c;华为汽车及相关均胜电子、联创电子、光峰科技等供应链企业也因此受益。 网络公开数据&#xff0c;在2024年1月1日-2月18日&#xff0c;中国市场新势力品牌销量排行榜中&#xff0c;问界就以4.25万辆的销量成绩霸榜第一&#xff0c;作…

幻兽帕鲁Palworld服务器搭建费用,仅需26元!

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

政务网站安全合规之道,云监测提供优质监测解决方案

近年来&#xff0c;国家对于网站安全风险的问题重视程度不断提升&#xff0c;持续加强对网站安全的监管力度。特别是政务网站&#xff0c;承载着越来越重要的核心应用和数据&#xff0c;与普通网站相比更容易遭到来自互联网的攻击。 攻击者为了破坏政务形象、干扰政务工作秩序或…

RC4算法:流密码算法的经典之作

title: RC4算法&#xff1a;流密码算法的经典之作 date: 2024/3/11 18:16:16 updated: 2024/3/11 18:16:16 tags: RC4起源演变算法优劣分析RC4 vs AES安全性RC4 vs DES性能比较应用场景介绍工作原理详解代码实例演示 一、RC4算法的起源与演变 RC4算法是由著名密码学家Ron Riv…

Oracle数据库迁移至达梦8数据库(windows图文讲解)

写作不易&#xff0c;如果对各位有用请给个赞支持一下~ 1.第一步安装达梦8数据库&#xff1a; 下载安装看我这篇博客 https://blog.csdn.net/li836779537/article/details/136641411?spm1001.2014.3001.5502 2.废话不多说直接开干&#xff0c;安装完成后打开迁移工具 名字…

指令微调(Instructional Fine-tuning)

定义 指令微调&#xff08;Instructional Fine-tuning&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;特别是在大型预训练语言模型&#xff08;如 GPT、BERT 等&#xff09;的应用中。在指令微调中&#xff0c;模型被进一步训练以更好地理解和遵循…

Linux--ELK 日志分析系统

ELK &#xff08;Elasticsearch、Logstash、Kibana&#xff09;日志分析系统的好处是可以集中查看所有服务器日志&#xff0c;减轻了工作量&#xff0c;从安全性的角度来看&#xff0c;这种集中日志管理可以有效查询以及跟踪服务器被攻击的行为。 > Elasticsearch 是个开源分…