[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量
最近希望实现一个页面局部刷新的功能,于是开始查阅ajax资料。幸好现在ajax很多功能都封装在jQuery这个库里面,我们可以很方便去调用。通过学习几个简单的小例子,可以实现简单的前端代码更新,还有重新加载一个文件内容到前端都可以实现。但是Django的前端template代码里面有变量,始终无法实现想要的功能。注意:此处的实现方法屏蔽了Django自带的"django.middleware.csrf.CsrfViewMiddleware" 这个中间件,直接在生产中实现会有风险隐患。
jQuery安装下载到本地或者直接引用:
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js">
</script>
</head>
这是我的一段前端代码,比较简单,有django基础的应该都可以看懂,就是去遍历reply_message里面所有的对象,然后比较parent_id_id值,并且打印。不太清楚语法的可以去看下Django里面的模板教程。
<div id = "reply_form" style="background-color: #E8E8E8">
{% for dic_reply in reply_message %}
{% ifequal dic_reply.parent_id_id dic.id %}
<p> <b>回复人:</b>{{dic_reply.user_name}} <b>时间:</b> {{dic_reply.time}} </p>
<p> <b>内容:</b>{{dic_reply.content}} </p>
{% endifequal %}
{% endfor %}
因为Django自带的框架还没有局部加载html页面的方法,而Ajax这个正好专门做这个事情。如果django只是通过HttpResponse传递一个变量,jQuery无法局部加载和template变量也无法渲染template模板
后来想到两思路:
1. 后台直接构成一个完整html格式内容,传给前端直接替换。
2.后台只传变量到前端,通过js方法构成想要的html格式内容,再做替换。
其实两种方法区别就是一种在后台完成html内容构造,一种在前端构造。试验了很多次,没能成功,最后在高手指点下终于成功试出方法1。基本思路还是在后台先生成正确的html格式代码,再通过AJAX方法发到前端替换前端代码。
if request.is_ajax(): //判断request请求是否是Ajax类型的
t = get_template('reply_form.html') //获取模板内容
content_html = t.render(Context({'reply_message':ReplyMessage_dic})) //渲染模板生成想要的全部局部html内容,而不是某一个变量
payload = {
'content_html': content_html,
'success': True} //构造json类型数据,以方便前端处理
return HttpResponse(json.dumps(payload), //这个地方最好保证用json的方法传送数据,否则会出现意想不到的错误
mimetype="application/json") //用json类型返回数据到前端
这地方要注意的问题是渲染模板不能用render_to_response的方法,否则就直接返回到前端了。返回HttpResponse要加mimetype="application/json"参数,否则可能会出现前端页面无法通过json的方法获取到对应的值
前端JS代码:
<script type="text/javascript">
$(document).ready(function() {
$('#reply_submit').submit(function() { // catch the form's submit event
$.ajax({ // create an AJAX call...
data: $(this).serialize(), // get the form data
type: $(this).attr('method'), // GET or POST
url: $(this).attr('action'), // the file to call; send the data to server
success:function(responseData) { // on success.. get respose from the server
$('#reply_form').html(responseData.content_html); // update the DIV with response
}
});
return false; //avoid submitting the content to server directly
});
});
</script>
几点说明的:
1.responseData就是后台传过来的json类型数据,即我们构造的payload,有点python里面字典数据类型,实际上通过json.dump方法传递后已经是一个json数据类型。这样方便前端用json方法访问。而responseData.content_html就是我们要替换实际内容。关于json数据类型具体介绍可以上W3c去查阅。
2. 调式前端问题可以通过firebug,fiddler等工具调试。
[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量的更多相关文章
- Django基础五之Ajax
Django基础五之Ajax 目录 Django基础五之Ajax 1. Ajax介绍 2. Ajax前后端传值 2.1 方法一HttpResponse直接返回 2.2 方法二使用Json格式返回 2. ...
- django 使用jquery ajax post数据问题
django 开启了CSRF功能导致jquery ajax post数据报错 解决方法在post数据里引入csrfmiddlewaretoken: '{{ csrf_token }}'},同时需要在f ...
- 框架----Django之Ajax全套实例(原生AJAX,jQuery Ajax,“伪”AJAX,JSONP,CORS)
一.原生AJAX,jQuery Ajax,“伪”AJAX,JSONP 1. 浏览器访问 http://127.0.0.1:8000/index/ http://127.0.0.1:8000/fake_ ...
- django之使用jquery完成ajax
使用Ajax 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差 改进方案:通过ajax的方 ...
- [Django]网页中利用ajax实现批量导入数据功能
url.py代码: url(r'^workimport/$', 'keywork.views.import_keywork', name='import_keywork') view.py代码: fr ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
- Django(十三)ajax 与 Bootstrap,font-awesome
prop,attr,val font-awesome:字体,图标库 对话框添加,删除,修改: 添加: Ajax偷偷向后台发请求: 1. 下载引入jQuery 2. $.ajax({ url: '/ad ...
- {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)
Django基础七之Ajax 本节目录 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解) 一 Ajax简介 ...
- Django实战(16):Django+jquery
现在我们有了一个使用json格式的RESTful API,可以实现这样的功能了:为了避免在产品列表和购物车之间来回切换,需要在产品列表界面显示购物车,并且通过ajax的方式不刷新界面就更新购物车的显示 ...
随机推荐
- [翻译]Orchard文档-命令行基架
Code generation是一个用于创建附加文件和扩展的自动化任务Orchard模块.这个功能对开发者创建控制器[Controllers].数据迁移类[Data Migration].模块[Mod ...
- SRAM与SDRAM的比较(转)
原文:http://blog.csdn.net/fg8181/article/details/2278100 内存在电脑中起着举足轻重的作用,一般采用半导体存储单元,包括随机存储器(RAM),只读存储 ...
- WPF笔记(2.4 Grid)——Layout
原文:WPF笔记(2.4 Grid)--Layout 第一章已经简单介绍过这个容器,这一节详细介绍.Grid一般是用表格(Grid.Row 和Grid.Column )的,比StackPanel更细致 ...
- zabbix 通过gateway 获取远程主机的JMX信息
DBHost=192.168.32.55 DBName= zabbix DBUser=zabbixuser DBPassword=zabbixpass StartTrappers=20 MaxHous ...
- 年度钜献,108个大数据文档PDF开放下载
1.大数据的开放式创新——吴甘沙 相关阅读:[PPT]吴甘沙:让不同领域的数据真正流动.融合起来,才能释放大数据的价值 下载:大数据的开放式创新——吴甘沙.pdf 2.微软严治庆——让大数据为每个人服 ...
- devStack
1,devstack shell 脚本开源官网 http://devstack.org/ 脚本功能快速搭建 OpenStack 的运行和开发环境 [Note tips by Ruiy devstack ...
- Unity 代码规范(PlateFace)1.0版本
PlateFace Unity开发规范(1.0) 1.项目都采用英文名命名,图片,音频,资源都不能采用中文. 2.方法名: 帕斯卡命名(所有单词首字母大写) 3.字段: 在Unity中组件字段名第一个 ...
- [Manacher][HDU3613][Best Reward]
题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 裸的: 枚举分割点,计算, ...
- 【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑
Assemble Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3171 Accepted: 1013 Descript ...
- NET基础课--JIT编译器如何工作1
1..Net运行时调用JIT编译器,用来把由C#编译器生成的IL指令编译成机器代码.这一任务在应用程序的运行期间是分步进行的.JIT并不是在程序一开始就编译整个应用程序,取而代之的是,CLR是一个函数 ...