2010-11-11 37 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告訴我語法是無效的,但是當執行腳本時,它的工作非常完美。