Django - 使用 chart.js 在 jinja 模板中循环显示相同的图表
Django - display the same chart in loop in jinja template with chart.js
我想循环显示同一个图表(当然有不同的数据和标签)。此时我有:
<tbody>
{% for key, value in game_details.items %}
<tr>
<td>{{ key }}</td>
<td>{{ value.all }}</td>
<td>{{ value.win }}</td>
<td>{{ value.lost }}</td>
</tr>
<tr>
<td>
<canvas id="myChart" width="400" height="400"></canvas>
<script>
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Win', 'Lost'],
datasets: [{
label: '# of Votes',
data: [{{ value.win }}, {{ value.lost }}],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</td>
</tr>
{% endfor %}
</tbody>
第一个图表已显示,但当我在控制台中查看时,我可以看到:Uncaught SyntaxError: Identifier 'ctx' has already been declared (at (index):179:29)
。所以我的循环无法创建另一个图表,因为 ctx
已经声明。我的目标是显示字典上每次迭代的图表。我在看这个 ,但这并不能解决我的问题。我怎样才能正确地做到这一点?
构造您的 canvas 标识符和那些 JavaScript 常量名称
例如:
{% for key, value in game_details.items %}
<canvas id="myChart{{ loop.index }}" width="400" height="400"></canvas>
<script>
const ctx{{ loop.index }} = document.
getElementById('myChart{{ loop.index }}').
getContext('2d');
const myChart{{ loop.index }} = new Chart(ctx{{ loop.index }}, {
type: 'pie',
data: {
labels: ['Win', 'Lost'],
datasets: [{
label: '# of Votes',
data: [{{ value.win }}, {{ value.lost }}],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
{% endfor %}
我想循环显示同一个图表(当然有不同的数据和标签)。此时我有:
<tbody>
{% for key, value in game_details.items %}
<tr>
<td>{{ key }}</td>
<td>{{ value.all }}</td>
<td>{{ value.win }}</td>
<td>{{ value.lost }}</td>
</tr>
<tr>
<td>
<canvas id="myChart" width="400" height="400"></canvas>
<script>
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Win', 'Lost'],
datasets: [{
label: '# of Votes',
data: [{{ value.win }}, {{ value.lost }}],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</td>
</tr>
{% endfor %}
</tbody>
第一个图表已显示,但当我在控制台中查看时,我可以看到:Uncaught SyntaxError: Identifier 'ctx' has already been declared (at (index):179:29)
。所以我的循环无法创建另一个图表,因为 ctx
已经声明。我的目标是显示字典上每次迭代的图表。我在看这个
例如:
{% for key, value in game_details.items %}
<canvas id="myChart{{ loop.index }}" width="400" height="400"></canvas>
<script>
const ctx{{ loop.index }} = document.
getElementById('myChart{{ loop.index }}').
getContext('2d');
const myChart{{ loop.index }} = new Chart(ctx{{ loop.index }}, {
type: 'pie',
data: {
labels: ['Win', 'Lost'],
datasets: [{
label: '# of Votes',
data: [{{ value.win }}, {{ value.lost }}],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
{% endfor %}