如何将Python字典转换为JavaScript哈希表?

时间:2012-04-09 12:59:23

标签: javascript python django django-templates

我已经传递给模板常规Python字典,我需要在

$(document).ready(function() {.. }

将该Python字典转换为JavaScript字典。我试过像

var js_dict={{parameters}};

但我收到错误('而不是',所有字符串都以 u'开头)。 如何将Python字典转换为JavaScript哈希表?

8 个答案:

答案 0 :(得分:15)

Python和javascript都有关于如何表示字典的不同想法,这意味着您需要一个中间表示来在它们之间传递数据。最常见的方法是JSON,这是一种简单的轻量级数据交换格式。

使用python json library将您的python dict转换(或转储)为JSON字符串。然后在javascript中将JSON字符串解析为javascript dict。 (如果您使用的是JQuery,请使用jQuery.parseJSON

答案 1 :(得分:6)

您可以将其转换为JSON并在该模板中使用

在你的python代码中做

import json
...
...
return {'parameters': json.dumps(parameters)} #This data goes into your template

答案 2 :(得分:2)

您可以将json.dumps(parameters)mark_safe()

一起使用
def custom_view(request):
    ...
    return render(request, 'tmpl.html', {'parameters': mark_safe(json.dumps(parameters))})

使用mark_safe()我在模板中获取未转义的代码。

答案 3 :(得分:1)

正如其他人已经建议的那样,在您的视图中将字典转换为JSON然后将JSON传递给模板上下文实际上是您最好的方法,但如果您想将其保留为模板中的python字典,则可以;你只需要手动创建javascript版本(即你不能只用{{ parameters }}转储它)

<script>
    var js_dict = {
        {% for k, v in parameters %}
        "{{ k }}": "{{ v }}"{% if not forloop.last %},{% endif %}
        {% endfor %}
    }
</script>

答案 4 :(得分:1)

一个工作示例受到Chris Patt在下面的回答的启发(注意区别):

 42     var js_dict = [
 43         {% for k, v in parameters.iteritems %}
 44             ["{{ k }}","{{ v }}"] {% if not forloop.last %},{% endif %}
 45         {% endfor %}
 46     ];

在Django中处理模板中的变量时,默认的python的json lib似乎不适合我。

答案 5 :(得分:1)

我发现这对于包含[']的字符串也有帮助

const convertPythonDictToJSON = function (data) {
    let d = data.replace(new RegExp(`(?<=[a-zA-Z])'(?=[a-zA-Z ])`, "g"), '__')
    d = d.replace(new RegExp("'", 'g'), '"')
    d = d.replace(new RegExp("__", 'g'), "'")
    d = d.replace(new RegExp("None", 'g'), 'null')
    d = d.replace(new RegExp("False", 'g'), 'false')
    d = d.replace(new RegExp("True", 'g'), 'true')
    return JSON.parse(d)
}

答案 6 :(得分:0)

您无需发送字典。

以下是我实施此方法的方法:

<强> views.py

def mess_opi(request):
    data = Opi_calculated.objects.all()

return render(request,'hab_app/opi_student_portal.html', {'data': data})

我的模板(适用于morris.html):

data: [{% for item in data %}
    { "y": '{{ item.hostelName }}', "a": '{{ item.opi_value }}' }{% if not forloop.last %},{% endif %}
{% endfor %}],

答案 7 :(得分:0)

如何通过在模板页面上传递对象而不是从py文件传递dict来处理这种情况,并且我在模板本身上创建了所需的dict。 喜欢:

在我的py:

def abc(request): 
     conf = assessment_master.objects.all()
     return render(request, "enter_scheme.html", {'conf':conf})
在我的django模板上: 在我的脚本标签内:

<script>
           var conf_dict_list = {};
           {% for obj in conf_dict_list %}
               conf_dict_list["{{ obj.short_name }}"] = "{{ obj.select }}"
           {% endfor %}

            alert(JSON.stringify(conf_dict_list));
            // alert('key' in conf_dict_list); to check key is present in dict

</script>