将Python数据结构转换为JavaScript,包括函数

将Python数据结构转换为JavaScript,包括函数,python,json,django,c3.js,Python,Json,Django,C3.js,我正在使用C3.js为我的Django应用程序创建图表。在我的Django模板中,我有一个JavaScript片段,如下所示: <script> var chart = c3.generate({{ chart_data|safe }}); </script> 这很好,我得到了这样的结果 对于更复杂的C3图表,我需要能够在C3.generate的参数中包含JavaScript函数。(例如中的onclick值。)但JSON不支持表示函数,并添加'onclick':'fun

我正在使用C3.js为我的Django应用程序创建图表。在我的Django模板中,我有一个JavaScript片段,如下所示:

<script>
var chart = c3.generate({{ chart_data|safe }});
</script>
这很好,我得到了这样的结果

对于更复杂的C3图表,我需要能够在C3.generate的参数中包含JavaScript函数。(例如中的
onclick
值。)但JSON不支持表示函数,并添加
'onclick':'function(d,i){…};'只会产生一个字符串。试图将
json.jsonecoder
子类化似乎是徒劳的,因为我需要输出的不是有效的json,而是实际的JavaScript


有没有一种简洁的方法可以做到这一点?目前我正在做一个笨拙的变通方法,将JavaScript函数代码插入到
json.dumps()

的反射结果中,我想我要问的是以错误的方式处理问题的情况,或者

c3.generate()
的数据结构包含两个方面:

  • 数据结构和图表外观的配置,以及
  • 要在图表中呈现的实际数据
  • 我没有特别的理由需要在Django视图代码中设置配置。通过这种实现,我可以将配置(包括我想要添加的有问题的“onclick”JavaScript函数)移动到模板中,并将数据注入到单独的变量中

    模板将是:

    <script>
    var columns = {{ chart_columns|safe }};
    var chart = c3.generate({
        bindto: '#chart',
        data: {
          columns: columns,
          onclick: function (d, i) { /* ... */ }
        }
    });
    </script>
    
    除了解决我的问题,这更适合Django的模型视图模板设计

    <script>
    var columns = {{ chart_columns|safe }};
    var chart = c3.generate({
        bindto: '#chart',
        data: {
          columns: columns,
          onclick: function (d, i) { /* ... */ }
        }
    });
    </script>
    
    chart = [
        ['data1', 30, 200, 100, 400, 150, 250],
        ['data2', 50, 20, 10, 40, 15, 25]
    ]
    return render_to_response('chart.html', {'chart_columns': json.dumps(chart)})