【问题标题】:How can I convert Python dictionary to JavaScript hash table?如何将 Python 字典转换为 JavaScript 哈希表?
【发布时间】:2012-04-21 20:19:44
【问题描述】:

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

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

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

var js_dict={{parameters}};

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

【问题讨论】:

  • 你检查过python中是否有JSON.stringify等价物吗?

标签: javascript python django django-templates


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以将其转换为 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(),我在模板中得到未转义的代码。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            受以下 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 库似乎对我不起作用。

            【讨论】:

              【解决方案7】:

              您不需要发送字典。

              我是这样实现的:

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

              【讨论】:

                【解决方案8】:

                如何通过在模板页面上传递对象而不是从 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-07-18
                  • 1970-01-01
                  • 2012-11-11
                  • 2012-08-23
                  • 1970-01-01
                  • 2018-11-20
                  • 2017-07-05
                  • 2013-02-19
                  • 2021-08-26
                  相关资源
                  最近更新 更多