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 已经声明。我的目标是显示字典上每次迭代的图表。我在看这个 ,但这并不能解决我的问题。我怎样才能正确地做到这一点?

使用 loop index loop.index:

构造您的 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 %}