我建议不要在你的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