Как динамически отображать все месяцы в шаблоне django - PullRequest
0 голосов
/ 26 июня 2019

Здесь я пытаюсь отобразить линейную диаграмму студентов, добавленных в каждом месяце определенного года.Но у меня есть небольшая проблема здесь.Проблема в сценарии.Например, у меня есть только студенты, добавленные в june(1 students) и july(6 students), а в другой месяц число студентов составляет zero. Но при отображении june и july число студентов находится в jan и febмесяц.Я думаю, что единственное решение - сделать labels в сценарии динамическим, как это {{student.month|date:'F'}},, но я хочу добавить все 12 месяцев в labels, даже если в некоторые месяцы нет учеников.Как я могу это сделать?

views.py

def home(request):
    students_according_to_month = Student.objects.annotate(month=TruncMonth(F('joined_date'))).values('month')
.annotate(total=Count('pk'))

template

<script>
    /* LINE CHART */
  var ctx3 = document.getElementById('chartLine1');
  var myChart3 = new Chart(ctx3, {
    type: 'line',
    data: {
      labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','July','Aug','Sep','Oct','Nov','Dec'],
      datasets: [{
        label: '# of Votes',
        data: [
            {% for student in students_according_to_month %}
          {{student.total}},
    {% endfor %}
    ],
        borderColor: '#dc3545',
        borderWidth: 1,
        fill: false
      }]
    },
    options: {
      legend: {
        display: false,
          labels: {
            display: false
          }
      },
      scales: {
        yAxes: [{
          ticks: {
            beginAtZero:true,
            fontSize: 10,
            max: {{students|length}}
          }
        }],
        xAxes: [{
          ticks: {
            beginAtZero:true,
            fontSize: 11
          }
        }]
      }
    }
  });
</script>

1 Ответ

0 голосов
/ 26 июня 2019

Насколько важно выполнить максимально эффективный запрос к базе данных?

Несколько менее эффективным способом было бы возвращать данные для каждого учащегося (что соответствует критериям фильтра?), А затем реорганизовывать их в ежемесячную информацию в Python. Если количество студентов меньше тысячи, это вряд ли станет проблемой. Что-то вроде

query = Student.objects.filter( ... # if you need to filter
     ).annotate(month=TruncMonth(F('joined_date'))).values_list('month', flat=True)
month_totals = [ 0,0,0,0, 0,0,0,0, 0,0,0,0 ]
for month in query:
    # convert month into an integer in range 0-11 if that's not what it is already
    # month = map_dict[month]
    month_totals[month] += 1

и теперь у вас есть общее количество за каждый месяц, включая те месяцы с нулевым числом учеников. Передайте month_totals в шаблон, и

    data: [
        {% for total in month_totals %} 
            {{total}},
        {% endfor %}
    ],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...