背景
“领导”一再叮嘱我不要“直接传对象”,我理解成了不管怎么样都不要从后台向前台直接传对象,也没有深究里面的原因,就相当于背过了一个“知识点”,前几天因此遇到了一个“很奇怪”的问题:在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 %}:所有处于这对标签之间的变量都不转义