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

8
我已经传递了一个普通的Python字典给模板,我需要在 $(document).ready(function() {.. } 中将该Python字典转换为JavaScript字典。我尝试过以下方法:
var js_dict={{parameters}};

但是我遇到了错误(使用'代替",并且所有字符串都以u'开头)。如何将Python字典转换为JavaScript哈希表?


你有没有检查过 Python 中是否有 JSON.stringify 的等效方法? - lowerkey
8个回答

20

Python和JavaScript在表示字典方面有不同的想法,这意味着需要使用中间表示来在它们之间传递数据。最常用的方法是JSON,它是一种简单的轻量级数据交换格式。

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


7
您可以将其转换为JSON并在模板中使用。
在您的Python代码中执行以下操作:
import json
...
...
return {'parameters': json.dumps(parameters)} #This data goes into your template

3
您可以使用json.dumps(parameters)mark_safe()
def custom_view(request):
    ...
    return render(request, 'tmpl.html', {'parameters': mark_safe(json.dumps(parameters))})

使用mark_safe()可以在模板中得到不被转义的代码。


3

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

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)
}

例如在{'notes': "1950's"}中,当'位于"内时,会产生错误。 - Ahmed Fasih
我也会在 NoneFalseTrue 周围使用 单词边界断言 \b:例如 / \bNone\b/g,以避免替换字符串内部的这些关键字。当然,这并不是绝对可靠的方法,但... - Ahmed Fasih
我也会为 ' 占位符生成一个随机字符串,而不是 __,更加健壮。 - Ahmed Fasih

1

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

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

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     ];

默认的Python JSON库在Django模板中处理变量时似乎无法正常工作。

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>

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 %}],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接