最近想在使用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. C#获取CSV文件内容对逗号和引号分隔的处理

    我们知道,使用excel工具保存成csv文件时有几个规则: 1.每一行的单元格内容之间用逗号分隔. 2.如果单元格的内容本身有逗号,这个单元格的内容将会用引号包含. 3.如果单元格的内容本身有引号 1 ...

  2. JS在window和document的应用

    页面跳转: window.location.href('地址') window.open('地址', '_self') 打开新窗口: window.open('地址', '_blank') 只显示地址 ...

  3. C++输入cout与输出cin

    输入和输出并不是C++语言中的正式组成成分.C和C++本身都没有为输入和输出提供专门的语句结构.输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的.C++的输出和输入是用" ...

  4. PackageManager源码分析

    在android 4.4源码上进行的分析. 一.PackageManager如何产生的? 我们平时在代码中使用的context.getPackageManager() 那么这个PackageManag ...

  5. [sqoop1.99.7] sqoop实例——数据ETL

    一.创建一个mysql的link MySQL链接使用的是JDBC,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MySQL.确保mysql的jar包已经导入到${SQO ...

  6. json和jsonp(json是目的,jsonp是手段)

    自己理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议.我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的" ...

  7. JavaWeb前端:CSS

    CSS 主要是要熟悉的掌握选择器 Div 的盒模型: 整个网页被切割成一个一个盒子,盒子可以套盒子,每个盒子通过以下几个主要属性来控制显示位置: 边框 Border-top, Border-botto ...

  8. javaWeb中 servlet 、request 、response

    1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个S ...

  9. flume介绍与原理(一)

    1 .背景 flume是由cloudera软件公司产出的可分布式日志收集系统,后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一.尤其近几年随着flume的不断被完善以及升级版本 ...

  10. 51nod 1181 质数中的质数(质数筛法)

    题目链接:51nod 1181 质数中的质数(质数筛法) #include<cstdio> #include<cmath> #include<cstring> #i ...