简体   繁体   English

如何将python / Django列表/字典转换为javascript

[英]How to get python/Django lists/dictionaries into javascript

I want to push some server-side data into my javascript for display purposes. 我想将一些服务器端数据推送到我的JavaScript中,以进行显示。 I have a list of serializable dictionary objects representing pieces of my data model that I want to use in javascript. 我有一个可序列化的字典对象的列表,它们表示要在javascript中使用的数据模型的各个部分。 These objects are defined as such: 这些对象的定义如下:

event_types = EventType.objects.all()
    et = []
    for t in event_types:
        et.append({'name' : t.name, 'internal_name' : t.internal_name}) # both names are strings

I push these up in the context variable to my template, and try to add it to javascript: 我将它们在上下文变量中推送到模板中,然后尝试将其添加到javascript中:

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

This doesn't work, as I get "Unexpected token '&'" as a javascript error. 这不起作用,因为我收到“意外令牌'&'”作为JavaScript错误。 I then try commenting out that code and seeing what renders, and this is what I see: 然后,我尝试注释掉该代码并查看呈现的内容,这就是我看到的内容:

[{&#39;name&#39;: u&#39;My Event&#39;, &#39;internal_name&#39;: u&#39;my_event&#39;}];

Clearly that is not desirable formatting. 显然,这不是理想的格式。 What is the correct way of pushing server-side Django data up to Javascript? 将服务器端Django数据推送至Javascript的正确方法是什么?

The formatting you see is because the objects you pass to the template are being converted to strings using their repr representations, and those strings are then being html encoded (so that if they were displayed on a page as text, you'd see the correct python repr on the page). 看到的格式是因为传递给模板的对象已使用其repr表示形式转换为字符串,然后对这些字符串进行了html编码(因此,如果它们以文本形式显示在页面上,则可以看到正确的页面上的python repr )。

What you want is to convert your objects to Javascript syntax, and not encode them further. 您想要的是将对象转换为Javascript语法,而不是对其进行进一步编码。

Fortunately, the builtin json.dumps will convert your objects to JSON. 幸运的是,内置的json.dumps会将您的对象转换为JSON。 You also need to turn escaping off for the block: 您还需要关闭该块的转义:

{% autoescape off %}
<script type="text/javascript">
    var event_types = {{event_types}};
</script>
{% endautoescape %}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM