这个问题已经被问,但没有回答这样一个.
在我的view.py
数据中从MySQL中提取数据,例如:
(Decimal('13'), Decimal('6'), Decimal('13')) (Decimal('207'), Decimal('18'), Decimal('129')) (Decimal('301'), Decimal('38'), Decimal('193')) (Decimal('204'), Decimal('32'), Decimal('150')) (Decimal('159'), Decimal('25'), Decimal('88')) args = {'array':array} return render_to_response('page2.html', args)
试图把它放入谷歌图表
function drawChart() { var djangoData = JSON.parse('{{ args }}'); var data = google.visualization.arrayToDataTable(djangoData);
也试过var djangoData = {{ array }};
两个没有运气!
建议
return render_to_response('page2.html', {'array': json.dumps(array)})
看起来它会起作用,除了db产生不兼容的类型.有没有办法在不将每个项目转换为int
类型的情况下执行此操作.或者,如果有一种pythonic方式转换它?
使用选定的答案并添加|safe
到数组,所以{{array|safe}}
你应该在view.py中尝试这个(别忘了添加import json
):
array = [['X', 'Y', 'Z'], [1, 2, 3], [4, 5, 6]] return render_to_response('page2.html', {'array': json.dumps(array)})
然后在模板中使用不带引号的原始值数组:
var djangoData = {{ array|safe }}; var data = google.visualization.arrayToDataTable(djangoData);
编辑:使用自定义JSONEncoder来处理Decimal
从这个问题中窃取的类型:
class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): return float(o) return super(DecimalEncoder, self).default(o)
然后在视图中:
array = [['X', 'Y', 'Z'], [Decimal('1'), Decimal('2'), Decimal('3')]] return render_to_response('page2.html', { 'array': json.dumps(array, cls=DecimalEncoder), })