django学习记录06-Ajax的初识

Ajax请求

1.1Ajax请求与get、post请求的区别

  • form请求:浏览器向网站发送请求时,url和表单的形式提交

    • GET请求:url方式获取数据
    • POST请求:以表单的形式提交数据

    特点: 一次完整的GET或POST请求,会进行一次页面刷新

  • 基于Ajax向后台发送请求(与post 一样偷偷发送请求)

    • 依赖于jQuery
    • 编写Ajax代码
    $.ajax({url: '/task/ajax',   //请求地址type: 'post',//请求类型(get)data: {      //传送的数据n1: 123,n2: 456,},//后端返回的是带有数据结构的数据//但是前端接收到的就是一个字符串,若想要获取到json格式的数据,需要加dataTypedataType: 'JSON',success: function (res) {  //执行成功的操作sussess(function定义success操作)//res 为json数据,带有数据结构console.log(res);      //接收视图函数task_ajax穿的数据res,并打印
    })
    

    success 操作。 表示执行成功获取后端的响应res之后的一系列操作

    {

    }

    def task_ajax(request):print("get:", request.GET)print("post:", request.POST)dict = {'status': True, 'data': [1, 2, 3, 4]}# 将数据json.dumps()则返回带有数据结构的数据return HttpResponse(json.dumps(dict))  # 返回{"status": true, "data": [1, 2, 3, 4]}
    

    dict = {'status': True, 'data': [1, 2, 3, 4]}

    return HttpResponse(dict) 返回statusdata

    return HttpResponse(json.dumps(dict)) 返回{“status”: true, “data”: [1, 2, 3, 4]}

GET和POST每次请求需要刷新,而Ajax不需要刷新页面,因此使用Ajax请求,可以将增删改查集成在一个网页中

1.2 Ajax的绑定方式

1.2.1 点击函数绑定

<h3>测试1</h3>
<input type="button" class="btn btn-primary" value="点击" onclick="clickMe()"> 
function clickMe() {//定义ajax$.ajax({url: '/task/ajax',   //请求地址type: 'post',//请求类型data: {      //传送的数据n1: 123,n2: 456,},success: function (res) {  //执行成功的操作sussess(function定义success操作)console.log(res);      //接收视图函数task_ajax穿的数据res,并打印}})}

onclick="clickMe()"通过此属性,绑定此按钮

通过点击此按钮,向'/task/ajax'传送数据,并获得响应res

1.2.2 借助jQuery绑定

  • 页面框架加载完成自动执行的操作
        $(function () {bindBtn1Event();//页面框架加载完成自动执行bindBtnEvent()函数})
  • jQuery相关知识点的应用

$('#id') 找到对应id的标签

$('.class') 找到对应class的标签

<h3>测试1</h3>
<input id="btn1" type="button" class="btn btn-primary" value="点击">
<script>
//方式2 利用jQuery方式绑定 id的方式绑定触发//页面框架加载完成自动执行$(function () {bindBtn1Event();//页面框架加载完成自动执行bindBtnEvent()函数})function bindBtn1Event() {//页面框架加载完成后,先找到id为btn1的位置,绑定点击执行某个操作$('#btn1').click(function () {$.ajax({url: '/task/ajax',   //请求地址type: 'post',//请求类型data: {      //传送的数据n1: 123,n2: 456,},//后端返回的是带有数据结构的数据//但是前端接收到的就是一个字符串,若想要获取到json格式的数据,需要加dataTypedataType: 'JSON',success: function (res) {  //执行成功的操作sussess(function定义success操作)//res 为json数据,带有数据结构console.log(res);      //接收视图函数task_ajax穿的数据res,并打印console.log(res.status);console.log(res.data);}})})}
</script>

$('#btn1').click(function () {xxxx }) 找到id=btn1的标签,点击后执行func函数一系列操作

1.2.3利用Ajax动态传输数据

  • 传输较少数据
    <h3>测试2</h3><input id="name" type="text" placeholder="姓名"><input id="age" type="text" placeholder="年龄"><input id="btn2" type="button" class="btn btn-primary" value="点击">
<script>//方式2 利用jQuery方式绑定 id的方式绑定触发//页面框架加载完成自动执行$(function () {bindBtn2Event();})function bindBtn2Event() {//页面框架加载完成后,先找到id为btn3的位置,绑定点击执行某个操作$('#btn2').click(function () {$.ajax({url: '/task/ajax',   //请求地址type: 'post',//请求类型data: {      //传送的数据//利用$('#id').val()动态获取输入的数据name: $('#name').val(),age: $('#age').val(),},//后端返回的是带有数据结构的数据//但是前端接收到的就是一个字符串,若想要获取到json格式的数据,需要加dataTypedataType: 'JSON',success: function (res) {  //执行成功的操作sussess(function定义success操作)//res 为json数据,带有数据结构console.log(res);      //接收视图函数task_ajax穿的数据res,并打印console.log(res.status);console.log(res.data);}})})}
</script>
data: {      //传送的数据//利用$('#id').val()动态获取输入的数据name: $('#name').val(),age: $('#age').val(),
}

使用id得到对应的input输入框输入的数据

  • 利用form传输多条数据
<h3>测试3</h3><form id="form3"><input name="name" type="text" placeholder="姓名"><input name="age" type="text" placeholder="年龄"><input name="phone" type="text" placeholder="手机号"><input name="wage" type="text" placeholder="工资"><input name="more" type="text" placeholder="更多"><input id="btn3" type="button" class="btn btn-primary" value="点击"></form>
<script>//方式2 利用jQuery方式绑定 id的方式绑定触发//页面框架加载完成自动执行$(function () {bindBtn2Event();})
function bindBtn3Event() {//页面框架加载完成后,先找到id为btn3的位置,绑定点击执行某个操作$('#btn3').click(function () {$.ajax({url: '/task/ajax',   //请求地址type: 'post',//请求类型data: $('#form3').serialize(),  //自动获取表单中所有输入框的数据(返回字典)//后端返回的是带有数据结构的数据//但是前端接收到的就是一个字符串,若想要获取到json格式的数据,需要加dataTypedataType: 'JSON',success: function (res) {  //执行成功的操作sussess(function定义success操作)//res 为json数据,带有数据结构console.log(res);      //接收视图函数task_ajax穿的数据res,并打印console.log(res.status);console.log(res.data);}})})}
</script>

data: $('#form3').serialize(), //自动获取表单中所有输入框的数据(返回字典)

1.2 Ajax实现任务列表功能

1.2.1 构造表

class Task(models.Model):"""任务"""title = models.CharField(max_length=64,verbose_name="标题")detail = models.TextField(verbose_name="详细信息")level_choice = ((1,'紧急'),(2,'重要'),(3,'一般'),)level = models.SmallIntegerField(verbose_name='级别',choices=level_choice, default=1)user = models.ForeignKey(verbose_name="负责人",to='Admin',on_delete=models.CASCADE)

1.2.2 任务展示列表

task_list.html

{% extends 'layout.html' %}{% block content %}<h1>Ajax案例</h1><div class="panel panel-default"><div class="panel-heading">任务列表</div>
...
...
...<div class="bs-example" data-example-id="hoverable-table"><table class="table table-hover"><thead><tr><th>ID</th><th>标题</th><th>详细信息</th><th>等级</th><th>负责人</th></tr></thead><tbody>{% for obj in queryset %}<tr><td>{{ obj.id }}</td><td>{{ obj.title }}</td><td>{{ obj.detail }}</td><td>{{ obj.get_level_display }}</td><td>{{ obj.user }}</td></div>{% endblock %}
...
...
{% block js %}
{% endblock %}

由于负责人为外键,数据展示时显示为对象,应在Admin表中让其默认返回username

class Admin(models.Model):"""管理员表"""username = models.CharField(max_length=32, verbose_name="用户名")password = models.CharField(max_length=64, verbose_name="密码")def __str__(self):return self.username

task.py

def task_list(request):form = TaskModelForm()queryset = models.Task.objects.all()return render(request, 'task_list.html', {"queryset": queryset, "form": form})

1.3 Ajax实现任务添加功能

task_list

{% extends 'layout.html' %}{% block content %}<h1>Ajax案例</h1><div class="panel panel-default"><div class="panel-heading">任务列表</div><div class="panel-body"><div class="bs-example" data-example-id="simple-form-inline"><form class="form" id="formAdd" novalidate>{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span class="error_msg" style="color: red;"></span></div>{% endfor %}<input id="btnAdd" type="button" class="btn btn-success" value="提交"></form></div></div>............
{% endblock %}{% block js %}<script>$(function () {bindBtnAddEvent();})function bindBtnAddEvent() {//页面框架加载完成后,先找到id为btnAdd的位置,绑定点击执行某个操作$('#btnAdd').click(function () {//每次填写前先把错信息清空$('.error_msg').empty()$.ajax({url: '/task/add',   //请求地址type: 'post',//请求类型data: $('#formAdd').serialize(),  //自动获取表单中所有输入框的数据(返回字典)//后端返回的是带有数据结构的数据//但是前端接收到的就是一个字符串,若想要获取到json格式的数据,需要加dataTypedataType: 'JSON',success: function (res) {if (res.status){alert("添加成功")}else {// res.errors = {'title': ['这个字段是必填项。'], 'detail': ['这个字段是必填项。'], 'user': ['这个字段是必填项。']}//遍历错误信息字典$.each(res.errors,function (name,data){console.log(name,data)$('#id_'+name).next().text(data[0]);})}}})})}</script>
{% endblock %}

task.py

@csrf_exempt
def task_add(request):form = TaskModelForm(request.POST)if form.is_valid():form.save()# Ajax无需刷新,因此不用跳转页面# 成功直接向前端传一个成功响应即可data_dict = {'status': True}return HttpResponse(json.dumps(data_dict))# 失败,将错误信息向前端传输data_dict = {'status': False, 'errors': form.errors}print(data_dict)return HttpResponse(json.dumps(data_dict,ensure_ascii=False))
  • 要点1

@csrf_exempt 接收ajax传来的post请求,需免除csrf_token验证

  • 要点2

data_dict = {'status': True} return HttpResponse(json.dumps(data_dict))

Ajax无需刷新,因此不用跳转页面,成功直接向前端传一个成功响应即可(此响应传输到中)

data_dict = {'status': False, 'errors': form.errors} return HttpResponse(json.dumps(data_dict,ensure_ascii=False))

若校验失败,将错误信息响应给Ajax的success中的res参数,便于前端显示

  • 要点3
success: function (res) {if (res.status){alert("添加成功")}else {
}
//遍历错误信息字典$.each(res.errors,function (name,data){$('#id_'+name).next().text(data[0]);})}
}

res.errors = {'title': ['这个字段是必填项。'], 'detail': ['这个字段是必填项。'], 'user': ['这个字段是必填项。']

$.each(res.errors,function (name,data){$('#id_'+name).next().text(data[0]);})

$.each()jQuery的遍历函数

$('#id_'+name).next().text(data[0]);表示将id为id_name的标签(form在生成input输入框时,默认id为id_name)的文本显示为错误列表第一条错误

  • 要点4

$('.error_msg').empty()

<span class="error_msg" style="color: red;"></span>

错误显示后,在下次Ajax请求后清除,避免校验成功还显示失败时的提示

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

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

相关文章

183基于matlab的非线性调频模态分解(VNCMD)

基于matlab的非线性调频模态分解(VNCMD)&#xff0c;一种基于变分方法的信号分解技术&#xff0c;它将信号分解为多个模式。能够处理非线性调频信号&#xff0c;且对噪声具有较好的鲁棒性。VNCMD的基本原理是通过最小化信号与模式之间的差异来实现信号的分解。程序已调通&#…

Latte:一个类似Sora的开源视频生成项目

前段时间OpenAI发布的Sora引起了巨大的轰动&#xff0c;最长可达1分钟的高清连贯视频生成能力秒杀了一众视频生成玩家。因为Sora没有公开发布&#xff0c;网上对Sora的解读翻来覆去就那么多&#xff0c;我也不想像复读机一样再重复一遍了。 本文给大家介绍一个类似Sora的视频生…

最简单的基于 FFmpeg 的 AVDevice 例子(屏幕录制)

最简单的基于 FFmpeg 的 AVDevice 例子&#xff08;屏幕录制&#xff09; 最简单的基于 FFmpeg 的 AVDevice 例子&#xff08;屏幕录制&#xff09;简介libavdevice 使用抓屏方法gdigrabdshow 源程序结果工程文件下载参考链接 最简单的基于 FFmpeg 的 AVDevice 例子&#xff08…

ASUS华硕天选2锐龙版笔记本电脑FA506ICB/FA706IC原装出厂Windows11系统,预装OEM系统恢复安装开箱状态

链接&#xff1a;https://pan.baidu.com/s/122iHHEOtNUu4azhVPnxNuA?pwdsqk7 提取码&#xff1a;sqk7 适用型号&#xff1a; FA506IM、FA506IE、FA506IC、FA506IHR FA506IR、FA506IHRB、FA506ICB、FA506IEB FA706IM、FA706IE、FA706IC、FA706IHR FA706IR、FA706IHRB、F…

FFmpeg【SDK02】关于AVIO的一些使用

读取本地文件&#xff08;网络流&#xff09;信息 #include <iostream> #include <stdio.h>extern "C" { #include <libavformat\avformat.h> #include <libavutil\avutil.h> #include <libavutil\log.h> #include <libavformat\a…

CSS的浮动属性,微信web开发

面试前的准备 在这部分&#xff0c;我将详细讲解面试前我们需要做哪些方面的工作&#xff0c;以保证我们在面试过程中更加顺利。 准备一份漂亮的简历 一份漂亮的简历就是你进入大厂的敲门砖。 网上有很多教程教大家如何写出一份漂亮的简历&#xff0c;这里我就不做重复劳动了…

开源模型应用落地-工具使用篇-Ollama(六)

一、前言 在AI大模型百花齐放的时代&#xff0c;很多人都对新兴技术充满了热情&#xff0c;都想尝试一下。但是&#xff0c;实际上要入门AI技术的门槛非常高。除了需要高端设备&#xff0c;还需要面临复杂的部署和安装过程&#xff0c;这让很多人望而却步。不过&#xff0c;随着…

LiveNVR监控流媒体Onvif/RTSP功能-视频广场点击在线或离线时展示状态记录快速查看通道离线原因

LiveNVR视频广场点击在线或离线时展示状态记录快速查看通道离线原因 1、状态记录1.1、点击在线查看1.2、点击离线查看 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、状态记录 1.1、点击在线查看 可以点击视频广场页面中&#xff0c; 在线 两个字查看状态记录 1.2、点击离线查…

Thinkphp5.1中,将数组赋值给js使用

一、例如Thinkphp5.1中的的代码是这样的 $data [status > 1,msg > 加载成功,data > [id > 1,username > 小洪帽,] ];$this->assign(data,$data);二、JS代码接收PHP中的数组 注意 <> 符号是不需要放引号的。 let arr <?json_encode($data)?>…

【Godot4自学手册】第二十节增加游戏的打击感,镜头震颤、冻结帧和死亡特效

这节我主要学习增加游戏的打击感。我们通过镜头震颤、冻结帧、增加攻击点特效&#xff0c;增加死亡。开始了。 一、添加攻击点特效 增加攻击点特效就是&#xff0c;在攻击敌人时&#xff0c;会在敌人受击点显示一个受击动画。 1.添加动画。 第一步先做个受击点动画。切换到…

交叉编译qt5.14.2

qt源码下载地址&#xff1a;qt-everywhere-src-5.14.2.tar.xz 1.修改qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-arm-gnueabi-g/qmake.conf文件&#xff1a; # # qmake configuration for building with arm-linux-gnueabi-g #MAKEFILE_GENERATOR UNIX CONFIG …

第三篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas股票市场数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas进行股票市场数据分析常见步骤和示例代码1. 加载数据2. 数据清洗和准备3. 分析股票价格和交易量4. 财务数据分析 二、扩展思路介绍1. 技术指标分析2. 波动性分析3. 相关性分析4.…

随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 public class Solution {public int MaxProfit(int[] prices) {if(prices.Length<2){return 0;}int [,]dpnew int[prices.Length,4];dp[0,0]-prices[0];for(int i1;i<prices.Length;i){dp[i,0]Math.Max(dp[i-1,0],Math.Max(dp[i-1,3]-pric…

STM32CubeIDE基础学习-基础外设初始化配置

STM32CubeIDE基础学习-基础外设初始化配置步骤 前言 前面的文章介绍了基础工程的创建步骤&#xff0c;这篇文章就接着在基础工程的基础上来配置相关外设了&#xff0c;下面以STM32F103C8T6的主芯片为例进行简单配置。 基础工程创建步骤回顾 具体的配置步骤流程如下&#xff1…

【Java数据结构 -- 二叉树有关面试OJ题2】

二叉树OJ面试题 1. 对称二叉树2.二叉树的构建及遍历3.二叉树的层序遍历4.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先5. 二叉树创建字符串用栈来存放路径上的节点 1. 对称二叉树 思路&#xff1a; 在根的值一样接着往下判断判断左树的左子树的值和右树的右子树的值…

【Linux】访问文件的本质|文件描述符|文件重定向

文章目录 文件的结构文件描述符标准输入输出文件描述符的规则 文件重定向输出重定向(对应符号>)echo的输出重定向 输入重定向&#xff08;对应符号<&#xff09;追加重定向&#xff08;对应符号‘>>’&#xff09;实现文件重定向的函数dup2()参数测试 前言&#xf…

could not publish server configuration for tomcat at localhost

1&#xff0c;报错信息如图&#xff1a; 2&#xff0c;找到servers双击&#xff0c;选择Modules&#xff0c;如果有两个webModules ,remove一个&#xff0c; 3&#xff0c;如果重启还是报错&#xff0c;干脆两个都remove&#xff0c;双击tomcat服务add And Remove重新添加

springboot/ssm酒店客房管理系统Java在线酒店预约预定平台web

springboot/ssm酒店客房管理系统Java在线酒店预约预定平台web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;…

【Python】深度学习基础知识——梯度下降详解和示例

尽管梯度下降&#xff08;gradient descent&#xff09;很少直接用于深度学习&#xff0c;但它是随机梯度下降算法的基础&#xff0c;也是很多问题的来源&#xff0c;如由于学习率过大&#xff0c;优化问题可能会发散&#xff0c;这种现象早已在梯度下降中出现。本文通过原理和…

Docker知识点总结

二、Docker基本命令&#xff1a; Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装&#xff0c;安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker&#xff1a; yum install docker -y -y 表示自动确认…