2010-11-11 80 views
0

可能您有Javascript从Django模板标签(例如var spec = "{{ foo }}";)读取变量值。JavaScript中的Django模板标签 - 无引号的无效语法,带引号的无效语法

但是,如果foo需要是JSON对象。它变成这样:

var spec = "{"2": {"guid": 2, "contentBlocks": {"2_1": {"guid": "2_1", "type": "list"}}}}"; 

前面对引号这使无效的JavaScript语法,但是,如果我离开他们,这也是一个无效的语法var spec = {{ foo }};

什么将是最好的方式解决这个问题?要么foo输出完整的<script></script>块,要么让JavaScript从服务器请求此对象,而不是通过模板标记输出它? ......

回答

1

如果是JSON对象,则根本不需要引用它。 JSON语法是有效的Javascript语法(尽管当然反过来不一定是真的)。

var spec = {{ foo }}; 

如果foo评估为JSON字符串,那是非常好的。

5

如果由于某种原因,你希望它是一个字符串,尝试单引号:

var spec = '{"2": {"guid": 2, "contentBlocks": {"2_1": {"guid": "2_1", "type": "list"}}}}'; 

如果你希望它是一个JavaScript对象,完全不使用引号。

var spec = {"2": {"guid": 2, "contentBlocks": {"2_1": {"guid": "2_1", "type": "list"}}}}; 

这是有效的语法。

但是,如果您不将它标记为安全,Django将会避免引号。所以,说你的模板json块是the_json,

var spec={{ the_json |safe }} 

是你想要的。没有安全筛选器,报价将输出为&quot;,使JSON无效。

+0

我通常在返回值中使用mark_safe(),或者你会不会推荐这么做? – 2010-11-12 09:54:25

+0

无论哪种方式都可以正常工作 - 取决于您是否愿意在模板或视图中执行此操作。 – 2010-11-12 11:42:42

1

如果JS嵌入到模板中,其他答案完全可以。如果你有一个静态地提供一个单独的.js文件,那么你就可以在你的模板暴露nesessary变量:

<script type="text/javascript"> 
    var g_foo = {{ foo }}; 
</script> 

- 然后在.js文件使用这个g_foo

0

感谢您的回答。事实证明,Dreamweaver告诉我语法是无效的,但是当执行脚本时,它的工作非常完美。