8

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

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

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

var js_dict={{parameters}};

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

4

8 回答 8

20

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

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

于 2012-04-09T13:11:10.563 回答
7

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

在你的 python 代码中做

import json
...
...
return {'parameters': json.dumps(parameters)} #This data goes into your template
于 2012-04-09T13:01:29.057 回答
3

你可以json.dumps(parameters)使用mark_safe()

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

随着mark_safe()我在模板中得到未转义的代码。

于 2017-09-26T00:10:22.667 回答
2

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

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)
}
于 2019-10-05T03:11:56.487 回答
1

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

<script>
    var js_dict = {
        {% for k, v in parameters %}
        "{{ k }}": "{{ v }}"{% if not forloop.last %},{% endif %}
        {% endfor %}
    }
</script>
于 2012-04-09T16:53:27.557 回答
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 库似乎对我不起作用。

于 2013-03-13T10:09:53.367 回答
0

您不需要发送字典。

这是我如何实现的:

视图.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 %}],
于 2017-12-29T04:15:11.383 回答
0

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

在我的 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>
于 2018-05-11T13:24:25.380 回答