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请求加载远 ...
随机推荐
- winform异步系统升级—BackgroundWorker
BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...
- 在Eclipse中,如何把一个java项目变成web项目
经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目.解决步骤:1.进入项目目录,可看到.project文件,打开.2.找到<natures>... ...
- Linux新建用户并添加到sudo组
原文参考链接:https://www.douban.com/note/338488349/ 以在kali 下添加一个test用户为例: Step1#:添加新用户useradd -r -m -s /bi ...
- 解决jquery操作checkbox全选全不选无法勾选问题
最近在学习中使用jquery操作checkbox,使用下面方法进行全选.反选:$("input[name='checkbox']").attr("checked" ...
- Linux基础知识
1.url中不写端口号,默认就是80端口:本机是127.0.0.1或者localhost 2.用户管理 查看当前用户: id:可以查看当前用户:whoami:查看当前的用户:who:可以查看当前已经登 ...
- javascript的假查询
1. function select(){ var text=$("#ss").val();//获得关键字 $("#show_tab tr").hide().f ...
- 移动端重构实战系列2——line list
这个line list的名字是我自己起的(大概的意思是单行列表),要实现的东西为sheral的line list,对应的scss组件为_line-list.scss,下图为line-list的一个缩影 ...
- 微信webview
会露出灰色的地步 https://segmentfault.com/q/1010000004295291 有说用iscroll5来解决,但是明显有bug啊 https://segmentfault.c ...
- 移动端弹性布局--flex
目前,Flex布局,可以简便.完整.响应式地实现各种页面布局.而且,它已得到了所有浏览器的支持,这意味着,我们能很安全地使用这项功能. 如果你对弹性网页布局感兴趣,那可别错过flex这么好用的属性哦. ...
- javascript中运算符的优先级
运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低 ...