最近想在使用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. pandas应用之分组因子暴露和分位数分析

    pandas应用之分组因子暴露和分位数分析 首先感谢原书作者Mes McKinney和batteryhp网友的博文, 俺在此基础上继续探索python的神奇功能. 用A股的实际数据, 以书里的代码为蓝 ...

  2. windows php线程安全和不安全,两个版本我也看不懂,记下来再说。

    Windows下的PHP版本分两种:线程安全版本与非线程安全版本. 要论两者的区别,详细论说起来比较麻烦,从使用者的角度,记住什么时候用哪种版本的区别就可以了吧: 1.windows + IIS + ...

  3. 命名空间$.fn

    $.fn.xxx是可以用对象来调用的命名空间,例如 $.fn.input() 在声明时就可以用 $('abc').input()    $.fx是指jquery的特效. 如果使用显示.滑动.淡入淡出. ...

  4. OAM

    OAM -- Operation Administration and Maintenance[ˈmentənəns]. 根据运营商网络运营的实际需要,通常将网络的管理工作划分为3大类:操作(Oper ...

  5. 准循环LDPC码用于公钥密码时的奇偶校验矩阵

    设H为奇偶校验矩阵,其行权重为d.Q为转置矩阵,其行权重为m.对于LDPC码,有d/n<< 1, m/n< 1. H´=H·QT是用于公钥密码的奇偶校验矩阵.它不是老密码G的奇偶校验 ...

  6. 转!!windows记事本保存“联通” 编码问题

    原博文网址:http://blog.csdn.net/Zhiyuan_Ma/article/details/51838054 简单分析: 这是微软记事本的一个BUG,准确点就是unicode编码的问题 ...

  7. JSON,Bean,XML,List,Map

    http://blog.csdn.net/superit401/article/details/51728929 JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把J ...

  8. sublime jsx 格式化工具

    1.到Sublime Text 3\Packages\ 目录下 git clone https://github.com/ionutvmi/sublime-jsfmt jsfmt 2.重启sublim ...

  9. centos7装机和初步运维

    1.装机-制作U盘启动盘 CentOS7是一个比较新的版本.在服务器领域用得比较多.因为前安装软件可能没有Ubuntu那样方便,所以桌面领域好像不是很多. https://www.centos.org ...

  10. 贪婪 vs 不贪婪

    当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式.当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你.匹配单个 HTML 标志的模式不能正常工作,因为 .* ...