一个简单的问题:在Django中如何将views.py中的变量传递到HTML/JavaScript中?

背景    

“领导”一再叮嘱我不要“直接传对象”,我理解成了不管怎么样都不要从后台向前台直接传对象,也没有深究里面的原因,就相当于背过了一个“知识点”,前几天因此遇到了一个“很奇怪”的问题:在views.py中有个字符串的list,我把它通过json.dumps处理一下然后就render到了某个页面,结果发现所有的双引号都变成了",遍历的时候问题百出,当时是百思不得其解,着实困惑了一会。

分析

这个问题二就二在json的使用上了,其实模板变量跟json是一点关系没有的,json只不过是把对象变成了字符串,而模板变量是不需要这一步转换的(我将ajax和模板变量已经混淆得一塌糊涂了)。为了理清这个问题,我整理了一个小例子:

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src='/static/jquery.js'></script>
<script>
	$(function(){
    	$.ajax({
			url:"/template_test",
			dataType:"text",
			success:function(data){
				$("body").html(data);
			},
			error:function(xhr){
				debugger;
			}
		});
		$.ajax({
			url:"/ajax_test",
			dataType:"json",
			success:function(data){
				$.each(data.myArray,function(index,value){
					console.log(value);
				});
			},
			error:function(xhr){
				debugger;
			}
		});
	});
</script>
</head>
<body>
</body>
</html>
template.html

{% for item in ret %}
	<p>{{item}}</p>
{% endfor %}
views.py/template_test

def template_test(request):
    ret=["a","b","c"]
    return render_to_response("template.html",locals(),context_instance=RequestContext(request))
views.py/ajax_test

def ajax_test(request):
    dict={"myArray":[1,2,3]}
    ret=json.dumps(dict)
    return HttpResponse(ret)

结果:

页面:


console控制台:


总结

传递给模板变量的数据和ajax的响应数据其实要求是不一样的。
1、传递给模板变量的可以是简单类型、对象类型以及自定义类型。有一点需要注意,模板变量x="1"和x=1,在html/js中值是一样的,都为1,没有双引号
2、ajax异步请求的数据(响应数据)一般都是字符串类型的,如果是list或dict等对象类型,会出错,尽管状态码可能还是200,不过这时要到error里去处理了,而不是success
3、回到最初的问题,&quto;的产生是由于模板变量的自动转义引起的,如果想原汁原味地传可通过过滤器实现,有两种方式:
  • {{ variable | safe }}:单个变量variable不转义
  • {% autoescape off %}  .....  {% endautoescape %}:所有处于这对标签之间的变量都不转义










  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值