Django - отображать тот же график в цикле в шаблоне jinja с помощью 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 уже объявлен. Моя цель - отображать диаграмму для каждой итерации по словарю. Я смотрел на этот сообщение, но это не единственная моя проблема. Как я могу сделать это правильно?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
8
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте свой идентификатор холста и эти имена констант JavaScript с помощью индекс петли loop.index:

Например:

{% 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 %}

У меня странное взаимодействие. Когда я добавляю {{ loop.index }} в 5 местах (id, ctx, getElementById, myChart и новый график), ничего не меняется. Отображается только 1 график. Но когда я меняю {{ loop.index }} на {{ key }}, первая диаграмма не отображается, а другие

Frendom 18.05.2022 00:00

Проверьте сгенерированный исходный код и убедитесь, что в нем нет лишнего места и что константы в порядке ctx1, ctx2, ctx3, ... то же самое для идентификатора холста, другой константы JS и т. д.

β.εηοιτ.βε 18.05.2022 00:14

Проблема решена. Одна из моих игр называлась ping-pong. Изменение его на pingpong решило проблему, и все графики отображаются

Frendom 18.05.2022 00:15

Другие вопросы по теме