Djanog结合jquery实现ajax

时间:2022-09-15 19:33:04

最近想在使用django的基础上通过jquery实现页面局部刷新的功能,研究了两天,终于是解决了这个问题,下面把方法步骤记录下来,以备以后重用。

在项目中通过两种形式实现了ajax:

第一种方法:web前端发送数据给服务器,服务器接收到数据后在服务端生成需要刷新的局部页面,然后把这个页面返回给web前端,前端直接使用这个页面来替换原页面;

第二种方法:和第一种方法的区别是服务器只生成需要的数据,将数据返回给web前端,前端通过jquery的dom方法来修改原页面的dom。

第一种方法的演示:

(1)前端的javascript代码:

 $(document).ready(function() {
$('#weaponSearchForm').submit(function(event) {
event.preventDefault(); //阻止表单提交的默认方法
var formValues = $('form').serialize(); //将表单的元素序列化为字符串
$.ajax({
dataType: "json",
data: formValues,
type: $(this).attr('method'),
url: $(this).attr('action'),
success: function(responseData) { //responseData是从服务器返回的数据
$('#table_container').html(responseData.content_html);
}
});
//return false;
});
});

(2) django的urls.py文件添加一项

url(r'^main/info/$', Info.as_view(), name='info'),

(3)django的views.py中的视图

 class Info(View):
template_name = "info.html" @csrf_exempt
@method_decorator(login_required(login_url='/login/'))
def dispatch(self, *args, **kwargs):
return super(Info,self).dispatch(*args, **kwargs) #用于呈现演示的这个页面
def get(self, request, *args, **kwargs): ……
…… return render(request,self.template_name,{}) def post(self, request, *args, **kwargs):
if request.is_ajax():
#这里搞了好久,用了request.raw_post_data和request.body都不行
#raw_post_data已经被弃用,request.body得到的是一个字符串,如果
#数据里包含中文,则中文会被显示为一些无法解析的字符。
#django对解析发送来的数据的方法进行了封装,不管客户端
#发送来的是普通数据还是json数据,都用request.POST或request.GET
#进行解析
b_id = request.POST['bID']
c_id = request.POST['cID'] t = get_template('search.html')
#strength_list是你需要生成的数据
content_html = t.render(Context({
'user': request.user,
'strength_list': strength_list}))
payload = {
'content_html': content_html,
'success': True}
return HttpResponse(json.dumps(payload),
mimetype="application/json")
else:
return HttpResponse('error')

上述代码需要注意的一点是,如果你使用的是post方法,django默认会进行csrf的检查,所以你需要在你的视图函数上加上@csrf_exempt这个装饰器。

第二种方法的演示:

为了实现选择框的级联动作,也就是第二个选择框中的内容会根据第一个选择框中选中的项进行自动更新。数据库中的结构就不说了,看下前端的jquery代码:

 $(document).ready(function() {
$('#bID').change(function(event) {
var selectValue = $(this).serialize();
$.ajax({
dataType: "json",
type: "POST",
data: selectValue,
url: "/info/selectbat/", //最后一个斜杠千万不能少了,否则django的地址映射会不成功
success: function(responseData) {
$('#cID').removeAttr('disabled');
$('#cID').empty();
var html = '<option value=""></option>';
$.each(responseData, function(entryIndex, entry) {
html += '<option value="' + entry[0] + '">';
html += entry[1];
html += '</option>';
})
$('#cID').html(html);
}
});
});
});

选择框的级联功能同样是在方法一介绍的那个页面中实现的,我这里用得方法也是post,当然,仍然可以在方法一中的那个类视图中实现,但是,为了让各个模块的功能更单一,我就把级联这个功能放在另一个类视图中实现,一个视图函数不一定非要呈现页面,它也可以返回数据,只要数据是HttpResponse对象即可。url.py文件中添加一行,让jquery中的设置的url和urls.py文件中的项匹配就行,看下视图中的代码:

 class SelectView(View):

     @csrf_exempt
@method_decorator(login_required(login_url='/login'))
def dispatch(self, *args, **kwargs):
return super(SelectView,self).dispatch(*args, **kwargs) def get(self,request,*args,**kwargs):
pass def post(self,request,*args,**kwargs):
if request.is_ajax():
b_id = request.POST['bID'] #得到post中的数据 comp_list = 你通过数据库查询到的数据
payload = []
for entry in comp_list:
payload.append([entry.id,entry.name]) return HttpResponse(json.dumps(payload),
mimetype='application/json')
else:
return HttpResponse("error")

代码看起来不复杂,但是在真正实现的过程中走了不少弯路,问题还是出在对django不是很熟。有时候在问题长时间无法解决时需要我们停下来想一想问题的症结在哪里,然后再对症下药。

下一步还需要通过ajax实现文件的上传功能,以后再添加吧。

Djanog结合jquery实现ajax的更多相关文章

  1. jQuery之ajax实现篇

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...

  2. 【原创经验分享】JQuery(Ajax)调用WCF服务

    最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...

  3. jQuery版AJAX简易封装

    开发过程中,AJAX的应用应该说非常频繁,当然,jQuery的AJAX函数已经非常好用,但是小编还是稍微整理下,方便不同需求下,可以简化输入参数,下面是实例代码: $(function(){ /** ...

  4. JS原生ajax与Jquery插件ajax深入学习

    序言: 近来随着项目的上线实施,稍微有点空闲,闲暇之时偶然发现之前写的关于javascript原生xmlHttpRequest ajax方法以及后来jquery插件ajax方法,于是就行了一些总结,因 ...

  5. 重写jquery的ajax方法

    //首先备份下jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=function(opt){ //备份opt中error和success ...

  6. Jquery通过Ajax方式来提交Form表单

    今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...

  7. 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache

    虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...

  8. jquery管理ajax异步-deferred对象

    今天跟大家分享一个jquery中的对象-deferred.其实早在jquery1.5.0版本中就已经引入这个对象了.不过可能在实际开发过程中用到的并不多,所以没有太在意. 这里先不说deferred的 ...

  9. Struts2 使用jQuery实现Ajax

    在jQuery中将Ajax相关的操作进行封装,使用时只需在合适的地方调用Ajax相关的方法即可,相比而言,使用jQuery实现Ajax更加简洁,方便 1.$.Ajax()可以通过发送Http请求加载远 ...

随机推荐

  1. 关于iOS10

    iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp://www.jianshu.com/p/54 ...

  2. mysql 截断

    当id为int是,如果是10位数,可以插入,primary key不能重复插入,其默认值可以为NULL一个varchar字段的值如果长度设定为255,则如果其长度为256也可以插入,但已经被截取到了2 ...

  3. 基于Linux的oracle数据库管理 part5&lpar; linux启动关闭 自动启动关闭 oracle &rpar;

    主要内容 1. 数据库自动启动与关闭 数据库自动启动与关闭 - 单数据库模式 启动监听器及数据库 启动脚本: #! /bin/bash su - oracle<<EOF lsnrctl s ...

  4. nginx打开目录游览功能

    #开启索引功能 location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; } #别名目录location ...

  5. Direct 2D实现界面库 &lpar;1&rpar;

    大学时尝试过很多次写一个UI库, 初次使用 GDI 绘图, 当时水平很低, GDI功能太弱, 以失败而告终. 之后使用 GDI+ 绘图, 当时水平依旧很低, GDI功能很强, 但效率实在太慢, 以失败 ...

  6. 20175310 《Java程序设计》第9周学习总结

    20175310 <Java程序设计>第9周学习总结 本周博客:https://www.cnblogs.com/xicyannn/p/10785915.html 教材学习内容总结 这周学习 ...

  7. timestamp时间格式

    时间戳(timestamp),通常是一个字符序列,唯一地标识某一刻的时间. 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的 ...

  8. 【github&amp&semi;&amp&semi;git】1、github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...

  9. python中的zip、lambda、map操作

    python 中有几个比较酷炫的操作,比如:zip.lambda.map 一.zip操作 zip字面意思:拉链.这么来记,把几个东西扔到一个包里,拉上拉链,就算打包好了.通俗点讲,就是把第1个参数.与 ...

  10. Java如何滚动几个小时和几个月?

    在Java中,如何滚动几个小时和几个月? 本示例展示了如何使用calender类的roll()方法滚动月(不改变年)或小时(不更改月或年). package com.yiibai; import ja ...