我建議不要在你的Django模板中放入大量的JavaScript - 它往往很難編寫和調試,特別是當你的項目擴展時。相反,嘗試將所有JavaScript寫入模板加載的單獨腳本文件中,並在模板中僅包含一個JSON數據對象。這可以讓你做一些事情,比如像JSLint這樣運行你的整個JavaScript應用程序,縮小它等等,你可以用一個靜態HTML文件測試它,而不需要依賴你的Django應用程序。使用像simplejson這樣的庫還可以節省編寫單調乏味的序列化代碼的時間。
如果你沒有假設你正在構建一個AJAX應用程序,這可能簡單地這樣做:
在視圖:
from django.utils import simplejson
def view(request, …):
js_data = simplejson.dumps(my_dict)
…
render_template_to_response("my_template.html", {"my_data": js_data, …})
在模板:
<script type="text/javascript">
data_from_django = {{ my_data }};
widget.init(data_from_django);
</script>
請注意,數據類型很重要:如果my_data
是一個簡單的數字或來自不包含HTML的受控源(例如格式化日期)的字符串,則不需要進行特殊處理d。如果可能有用戶提供的不可信數據,則需要使用類似escape或escapejs過濾器的方式對其進行消毒,並確保JavaScript安全地處理數據以避免cross-site scripting攻擊。
就日期而言,您可能還想考慮如何通過日期。我幾乎總是發現最容易通過他們爲Unix的時間戳:
在Django中:
time_t = time.mktime(my_date.timetuple())
在JavaScript中,假設你已經做了一些類似time_t = {{ time_t }}
上面的代碼片段的結果:
my_date = new Date();
my_date.setTime(time_t*1000);
最後,請注意UTC - 您希望Python和Django日期函數以UTC交換數據,以避免用戶當地時間的尷尬轉變。
編輯:請注意,JavaScript中的setTime是以毫秒爲單位,而time.mktime的輸出是秒。這就是爲什麼我們需要乘以1000
[Django的模板變量和Javascript]的可能的複製(http://stackoverflow.com/questions/298772/django-template-variables-and-javascript) – 2016-05-15 16:05:33