I'm trying to displays charts of the most sold items in the store. So I would need to take information from the database and into the html. The charts don't seem to load. When I tried static data (the examples from Google), it works fine. However, I cannot seem to do it with dynamic data. I converted the array into a json and did the |safe in the html for escaping. Yet still it doesn't appear. If anyone has an tips on how to fix it, please help!
Below is my views.py where I call the html file that has the script of charts.
def charts(request):
data_arr = []
for item in Item.objects.all():
data_arr.append([item.ItemName, item.quantity_sold])
return render(request,'coffeeapp/charts.html',{'item':json.dumps(data_arr)})
Here is my code in the charts.html file
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
// Define the chart to be drawn.
var data = google.visualization.arrayToDataTable(
['Item', 'Quantity Sold'],
[{{item|safe}}]
);
// Instantiate and draw the chart.
var chart = new google.visualization.PieChart(document.getElementById('myPieChart'));
chart.draw(data, null);
}
</script>
<!--Div that will hold the pie chart-->
<div id="myPieChart"/>
EDIT 1: What is in {{item|safe}}
I've printed out item in views.py and this is the result:
[["Espresso", 0], ["Cappuccino", 2], ["Black Coffee", 0], ["Cafe Latte", 0], ["Mocha", 0], ["Iced Americano", 0]....
In the browser/html, I've added an alert({{item|safe}}) as the first line under function drawChart() and it shows the items accurately from what I see.
Some results are as follows
Espresso,0,Cappuccino,2,Black Coffee,0,Cafe Latte,0,Mocha,0,Iced Americano,0,Iced Caramel Macchiato,0,Cold Brew,0....
EDIT 2 - SOLUTION
With help of Marco's answer, I was able to fix this issue. Marco had the answer to fixing the labels but the data rows were static meaning manually entered whereas I wanted to get it from the database. As such I had modified my views to be this.
def charts(request):
return render(request,'coffeeapp/charts.html',{'item':Item.objects.all()})
And my html to be:
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
// Define the chart to be drawn.
var data = google.visualization.arrayToDataTable([
[{ label: 'Item', type: 'string' },
{ label: 'Quantity Sold', type: 'number' }],
{% for i in item %}
['{{ i.ItemName }}', {{ i.quantity_sold }}],
{% endfor %}
]);
var options = {
'title': 'MOST ORDERED DRINKS',
'width': 700,
'height': 700
};
// Instantiate and draw the chart.
var chart = new google.visualization.PieChart(document.getElementById('myPieChart'));
chart.draw(data, options);
}
</script>
I am unsure on how it works but it does without the safe keyword.