电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Django如何與Ajax交互

瀏覽:3日期:2024-09-09 11:15:41
前后端傳輸數(shù)據(jù)的編碼格式

前后端傳輸數(shù)據(jù)的編碼格式主要有三種, 本文接下來將詳細(xì)演示。

urlencodedformdatajsonAjax提交urlencoded格式數(shù)據(jù)

Ajax給后臺發(fā)送數(shù)據(jù)的默認(rèn)編碼格式是urlencoded,比如username=abcde&password=123456的形式。Django后端拿到符合urlencoded編碼格式的數(shù)據(jù)都會自動幫你解析分裝到request.POST中,與form表單提交的數(shù)據(jù)相同。

下面兩種方式是等同的。

//手動構(gòu)造數(shù)據(jù)data$('#btnSubmit').click(function () { $.ajax({url: ’/auth/’, //也可以反向解析{% url ’login’ %}type: ’post’,data: { ’username’: $('#id_username').val(), ’password’: $(’#id_password’).val()},success: function (data){ } });}; // .serialize() 方法可將<input>, <textarea> 以及 <select>表單序列化// 成urlencoded格式數(shù)據(jù) $('#btnSubmit').click(function () { let data = $('#loginForm').serialize(); $.ajax({url: '/auth/', //別忘了加斜杠type: $('#loginForm').attr(’method’),data: data,success: function (data) { } });}); Ajax通過FormData上傳文件

Ajax上傳文件需要借助于js內(nèi)置對象FormData,另外上傳文件時表單千萬別忘了加enctype='multipart/form-data'屬性。

//案例1,點擊submi上傳文件$('#submitFile').click(function () { let formData = new FormData($('#upload-form')); $.ajax({ url:'/upload/',//也可以寫{% url ’upload’ %} type:'post', data:formData, //這兩個要必須寫 processData:false, //不預(yù)處理數(shù)據(jù) 因為FormData 已經(jīng)做了 contentType:false, //不指定編碼了 因為FormData 已經(jīng)做了 success:function(data){ console.log(data); } });}); //案例2,同時上傳文件并提交其它數(shù)據(jù)$('#submitFile').click(function () { //js取到文件 let myfile = $('#id_file')[0].files[0]; //生成一個FormData對象 let formdata = new FormData(); //加值 formdata.append(’name’, $('#id_name').val()); //加文件 formdata.append(’myfile’, myfile); $.ajax({url: ’/upload/’, //url別忘了加/杠type: ’post’,//這兩個要必須寫processData:false, //不預(yù)處理數(shù)據(jù) 因為FormData 已經(jīng)做了contentType:false, //不指定編碼了 因為FormData 已經(jīng)做了data: formdata,success: function (data) { console.log(data);} });}); Ajax提交Json格式數(shù)據(jù)

前后端傳輸數(shù)據(jù)的時候一定要確保聲明的編碼格式跟數(shù)據(jù)真正的格式是一致的。如果你通過Ajax發(fā)送Json格式數(shù)據(jù)給Django后端,請一定注意以下三點:

contentType參數(shù)指定成application/json; 數(shù)據(jù)是真正的json格式數(shù)據(jù); Django后端不會幫你處理json格式數(shù)據(jù)需要你自己去request.body獲取并處理。

$('#submitBtn').click(function () { var data_obj={’name’:’abcdef’,’password’:123456};//Javascript對象 $.ajax({url:’’,type:’post’,contentType:’application/json’, //一定要指定格式 contentTypedata:JSON.stringify(data_obj), //轉(zhuǎn)換成json字符串格式success:function (data) { console.log(data)} });});Ajax發(fā)送POST請求時如何通過CSRF認(rèn)證

// 第一種方式直接在發(fā)送數(shù)據(jù)中加入csrfmiddlewaretoken$('#btn').on('click',function () { $.ajax({url:'/some_url/',type:'POST',data:{ csrfmiddlewaretoken: {{ csrf_token }}, //寫在模板中,才會被渲染},success:function (data) { }});}); //通過jquery選擇器獲取csrfmiddlewaretoken$('#btn').on('click',function () { $.ajax({url:'/some_url/',type:'POST',data:{ csrfmiddlewaretoken:$(’[name='csrfmiddlewaretoken']’).val(),},success:function (data) { } });}); //使用jquery.cookie.js調(diào)用請求頭cookie中的csrftoken<script src='https://rkxy.com.cn/static/jquery.cookie.js'> <script> $('#btn').on('click',function () { $.ajax({url:'/some_url/',type:'POST',headers:{'X-CSRFToken':$.cookie(’csrftoken’)},data:$('#form1').serialize() }); })</script>Django Ajax案例1:聯(lián)動下例菜單

聯(lián)動下拉菜單是Web開發(fā)中一個被經(jīng)常使用的應(yīng)用。比如當(dāng)你從一個列表從選擇一個國家的時候,聯(lián)動下拉菜單會同步顯示屬于該國家所有城市列表供用戶選擇。今天我們就教你如何使用Django+Ajax生成聯(lián)動下拉菜單。

我們的模型如下所示:

class Country(models.Model): name = models.CharField(verbose_name='國家', max_length=50) def __str__(self):return self.nameclass City(models.Model): name = models.CharField(verbose_name='城市', max_length=50) country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name='國家',) def __str__(self):return self.name

我們的模板如下所示,表單中對應(yīng)國家和城市下拉菜單的DOM元素id分別為id_country和id_city。當(dāng)用戶選擇國家后,ajax會攜帶國家的id值向后臺發(fā)送請求獲得當(dāng)前國家的所有城市清單,并在前端渲染顯示。

{% block content %}<h2>創(chuàng)建用戶 - 聯(lián)動下拉菜單</h2><form method='post' role=’form’ action=''> {% csrf_token %} {{ form.as_p }} <button type='submit' class='btn btn-primary'>Submit</button></form>{% endblock %}<script src='https://code.jquery.com/jquery-3.1.0.min.js'></script><script> $('#id_country').change(function() { var country_id = $(this).val(); $.ajax({url: ’/ajax/load_cities/’,data: { ’country_id’: country_id},type: ’GET’,dataType: ’json’,success: function (data) { var content=’’; $.each(data, function(i, item){ content+=’<option value=’+item.id+’>’+item.name+’</option>’}); $(’#id_city’).html(content)}, }); }); </script>

Django負(fù)責(zé)處理視圖Ajax請求的視圖函數(shù)如下所示:

def ajax_load_cities(request): if request.method == ’GET’:country_id = request.GET.get(’country_id’, None)if country_id: data = list(City.objects.filter(country_id=country_id).values('id', 'name')) return JsonResponse(data, safe=False)Django Ajax案例2:Ajax上傳文件

前端模板及js文件如下所示, 請注意我們是如何在表單中加入了enctype屬性,如何使用FormData上傳文件,并解決了csrftoken問題的。

{% block content %}<form action='' method='post' enctype='multipart/form-data' id='form'> <ul class='errorlist'></ul> {% csrf_token %}{{ form.as_p }} <input type='button' value='submit' /></form><table id='result'></table>{% endblock %}{% block js %}<script src='http://www.hdgsjgj.cn/bcjs/ https://cdn.jsdelivr.net/jquery.cookie/1.4.1/jquery.cookie.min.js '></script><script>var csrftoken = $.cookie(’csrftoken’);function csrfSafeMethod(method) { return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}$(document).ready(function(){ $(’#btn’).click(function(e){e.preventDefault();// 構(gòu)建FormData對象var form_data = new FormData();form_data.append(’file’, $(’#id_file’)[0].files[0]);$.ajax({url: ’/file/ajax_upload/’,data: form_data,type: ’POST’,dataType: ’json’,// 告訴jQuery不要去處理發(fā)送的數(shù)據(jù), 發(fā)送對象。processData : false,// 告訴jQuery不要去設(shè)置Content-Type請求頭contentType : false,// 獲取POST所需的csrftokenbeforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader('X-CSRFToken', csrftoken); }},success: function (data) { if(data[’error_msg’]) {var content = ’<li>’+ data[’error_msg’] + ’</li>’;$(’ul.errorlist’).html(content); } else { var content= ’<thead><tr>’ + ’<th>Name and URL</th>’ + ’<th>Size</th>’ + ’</tr></thead><tbody>’; $.each(data, function(i, item) { content = content + ’<tr><td>’ + '<a href= ’ ' + item[’url’] + ' ’> ' + item[’url’] + ’</a></td><td>’ + item[’size’] + ’</td><td><tr>’}); content = content + '</tbody>'; $(’#result’).html(content); } },}); }); }); </script>{% endblock %}

Django負(fù)責(zé)處理視圖Ajax請求的視圖函數(shù)如下所示:

# handling AJAX requestsdef ajax_upload(request): if request.method == 'POST':form = FileUploadModelForm(data=request.POST, files=request.FILES)if form.is_valid(): form.save() # Obtain the latest file list files = File.objects.all().order_by(’-id’) data = [] for file in files:data.append({ 'url': file.file.url, 'size': filesizeformat(file.file.size), }) return JsonResponse(data, safe=False)else: data = {’error_msg’: 'Only jpg, pdf and xlsx files are allowed.'} return JsonResponse(data) return JsonResponse({’error_msg’: ’only POST method accpeted.’})

以上就是Django如何與Ajax交互的詳細(xì)內(nèi)容,更多關(guān)于Django與Ajax交互的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 三板富 | 专注于新三板的第一垂直服务平台 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 我车网|我关心的汽车资讯_汽车图片_汽车生活! | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 成都租车_成都租车公司_成都租车网_众行宝 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 百方网-百方电气网,电工电气行业专业的B2B电子商务平台 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | LED显示屏_LED屏方案设计精准报价专业安装丨四川诺显科技 |