Djanog结合jquery实现ajax
最近想在使用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的更多相关文章
- jQuery之ajax实现篇
jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...
- 【原创经验分享】JQuery(Ajax)调用WCF服务
最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...
- jQuery版AJAX简易封装
开发过程中,AJAX的应用应该说非常频繁,当然,jQuery的AJAX函数已经非常好用,但是小编还是稍微整理下,方便不同需求下,可以简化输入参数,下面是实例代码: $(function(){ /** ...
- JS原生ajax与Jquery插件ajax深入学习
序言: 近来随着项目的上线实施,稍微有点空闲,闲暇之时偶然发现之前写的关于javascript原生xmlHttpRequest ajax方法以及后来jquery插件ajax方法,于是就行了一些总结,因 ...
- 重写jquery的ajax方法
//首先备份下jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=function(opt){ //备份opt中error和success ...
- Jquery通过Ajax方式来提交Form表单
今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...
- 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache
虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...
- jquery管理ajax异步-deferred对象
今天跟大家分享一个jquery中的对象-deferred.其实早在jquery1.5.0版本中就已经引入这个对象了.不过可能在实际开发过程中用到的并不多,所以没有太在意. 这里先不说deferred的 ...
- Struts2 使用jQuery实现Ajax
在jQuery中将Ajax相关的操作进行封装,使用时只需在合适的地方调用Ajax相关的方法即可,相比而言,使用jQuery实现Ajax更加简洁,方便 1.$.Ajax()可以通过发送Http请求加载远 ...
随机推荐
- web前端网站收藏
参考 w3school:html,css,js等各种参考 W3schools:较之w3school界面更华丽 webplatform:学习最新的web技术 MDN:mozilla developer ...
- web开发必备插件
文本编辑器百度ueditor:http://ueditor.baidu.com/website/
- 慕课网__CSS__ Relative, absolute,
同时又left, right 或者 top, bottom时 relative, 尽量少用,会出现层级覆盖, 或者单独使用, 避免层级嵌套, 或者覆盖 absolute具有包裹性, 和破坏性 包裹性 ...
- C语言程序设计进阶 第1周编程题
第1周编程题 查看帮助 返回 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数 ...
- 上传文件创建目录 mkdir
mkdir($save_path,0777,true); $save_path :文件名 0777:权限 .windows 下面可以忽略 当创建多级文件目录的时候一定要加上 true
- Selenium:元素等待的4种方法
1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐示等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间.默认值是 ...
- mysql连接的一些问题。
最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...
- 【转】Python 日期和时间
本文转自:http://www.runoob.com/python/python-date-time.html Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Pytho ...
- 苹果MacBook Air安装win7
同事的一台mba,说iOS不习惯,希望装一个win7系统.机器看上去很小巧精致,运行iOS速度飞快.试着点了下鼠标,没反应,翻过来看了下,有个电源开关.拨了一下,细小的指示灯闪了闪,应该加上电了.唉, ...
- php 使用curl模拟登录discuz以及模拟发帖
<?php$discuz_url = 'http://127.0.0.1/discuz/';//论坛地址$login_url = $discuz_url .'logging.php?action ...