我需要将一些数据传递给javascript。所以我创建了一个template tag:
from django.utils.safestring import mark_safe
from django import template
import json
register = template.Library()
@register.simple_tag
def mydata():
return mark_safe(json.dumps([("a", 1), ("b", 2)])
然后在我的模板中,
<div id="mydata" data-stuff="{% mydata %}" style="display:none;"></div>
在jquery加载的js文件中使用了它:
$('#mydata').data('stuff') //automatically does JSON.parse
问题是来自"a"
和"b"
的引号会破坏HTML属性语法。我可以简单地更改为单引号(data-stuff='{% mydata %}'
)但是有更明确的django方法将JSON注入模板吗?也许类似于escape_my_json
或escape_for_html_attribute
函数。
答案 0 :(得分:1)
尽管将json存储在属性中有点麻烦,但单引号(撇号,U + 0027)不是JSON中的有效字符串分隔符。有些浏览器可能会遇到此问题,但我不能指出任何问题。
如果JSON结构不复杂,则将每个字段存储为单独的数据 - *,否则存储在JS中。
如果你需要使用属性...真的,真的...我不会替换引号(简单的替换将是松散的)更可能用base64编码它。
关于转义的注意事项:要转义双引号(单个引号),您可以使用过滤器addslashes(或在python django.template.defaultfilters.addslashes中),但它不能识别json数据,因此它可能会中断。 / p>