2009-09-18 135 views
46

我使用Django和Apache来提供网页。我的JavaScript代码当前包含一个数据对象,其中的值将根据用户从选项菜单中选择而显示在各种HTML小部件中。我想从Python字典中派生这些数据。我想我知道如何在JavaScript中嵌入JavaScript代码,但是如何将数据对象嵌入到该脚本中(即时),以便脚本的功能可以使用它?换句话说,我想从Python字典创建一个JavaScript对象或数组,然后将该对象插入到JavaScript代码中,然后将该JavaScript代码插入到HTML中。我想这个结构(例如嵌入在JavaScript代码中的变量中的数据)并不是最理想的,但作为新手我不知道替代方案。我已经看到了Django序列化函数的书写,但是直到我可以将数据放入我的JavaScript代码中,这些功能才帮助我。通过Django传递Python数据到JavaScript

我还没有使用jQuery等JavaScript库。

+0

[Django的模板变量和Javascript]的可能的复制(http://stackoverflow.com/questions/298772/django-template-variables-and-javascript) – 2016-05-15 16:05:33

回答

69

我建议不要在你的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。如果可能有用户提供的不可信数据,则需要使用类似escapeescapejs过滤器的方式对其进行消毒,并确保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

+0

谢谢。我计划将JavaScript作为媒体文件提供,类似于css样式表。这似乎比将数据嵌入到js中更好,但我必须学习一些JSON,并编写一些服务器端代码来处理数据请求。 – chernevik 2009-09-18 19:11:43

+0

听起来是一个好主意 - 我真的很喜欢这种方法的一件事是,编写一个返回JSON的Django视图是很简单的(如果你经常这样做,请看django-piston创建REST API),这很容易测试孤立的部分。 – 2009-09-18 21:19:29

+0

我不会无视这个!我只是建立我的写作和服务JavaScript的知识点,我实际上使用它。我现在计划使用JSON传递元数据以驱动哪些小部件受菜单选项影响,但这需要我学习更多关于创建和访问javascript数据结构的知识。 – chernevik 2009-09-22 21:47:34

2

这是不理想的。你有没有考虑过使用django的内置序列化器来传递数据为JSON?

+0

我以为我在涉及缩略词之前,先学习一些基础知识。但是,我似乎可以学习一些JSON,或者从基本元素中构建一个解决方案,一旦我学习了一些JSON,我将会废除它。 – chernevik 2009-09-18 19:08:23

3

您可以在您的.html模板中包含<script>标签,然后构建您的数据结构,但对您很方便。模板语言不仅适用于HTML,它还可以执行Javascript对象文字。

保罗是对的:最好使用json模块创建一个JSON字符串,然后将该字符串插入到模板中。这将最好地处理报价问题,并轻松处理深层结构。

1

请参阅相关回复this question。一种选择是使用jsonpickle在Python对象和JSON/Javascript对象之间进行序列化。它包装simplejson并处理通常不被simplejson接受的事物。

1

把Java脚本嵌入到Django模板中是而不是总是坏主意。

宁可,因为这个规则有一些例外。

一切都取决于您的Java脚本代码网站和功能。

最好有独立的静态文件,如JS,但问题是每个单独的文件需要另一个连接/ GET /请求/响应机制。有时对于小的一个,两个内码代码os JS把这个放到模板中,然后使用django templatetags机制 - 你可以使用在其他模板中;)

关于对象 - 相同。如果你的网站有AJAX构建/ web2.0喜欢 - 你可以达到很好的效果,把一些计数/数学运算到客户端。如果对象很小 - 嵌入到模板中,如果较大 - 在另一个连接中响应它们以避免用户挂起页面。

+0

是的,你已经内置json到Django;)忘记xml:P – bluszcz 2009-09-19 08:48:44

34

对于任何可能遇到问题的人,请确保您在模板中以安全模式呈现您的json对象。您可以手动设置此类似这样的

<script type="text/javascript"> 
    data_from_django = {{ my_data|safe }}; 
    widget.init(data_from_django); 
</script>