Django - передать словарь в шаблон и построить график - PullRequest
0 голосов
/ 02 июня 2019

У меня есть словарь, созданный в views.py, он выглядит примерно так, но имеет n предприятий

{ enterprise1: {'Year': ['2014/2015', '2016/2017', '2013/2014'], 
                'no_per_year': [16, 8, 6]}, 
  enterprise2: {'Year': ['2016/2017', '2013/2014', '2014/2015'], 
                'no_per_year': [2, 16, 11]},
  enterprise3: {'Year': ['2016/2017', '2013/2014', '2015/2016'], 
                'no_per_year': [19, 7, 14]},
    ....
    ....
    .... 
}

Как передать этот словарь в шаблон и построить линейный график, на котором изображены всепредприятия и количество студентов, которых они набирают в каждом году.Json, javascripts - что-то очень новое для меня, буду признателен за любую помощь.
Ниже приведен код, который я пробовал со статическими данными, неявно записывая данные без каких-либо циклов.Как я могу преобразовать это, чтобы взять эти данные n предприятий и участка?

{% extends "base.html" %}
{% load static %} 

<script>
{% block jquery %}
$.ajax({
    success: function(data) {
       setchart()
       setchart2()

    },
    error: function(error_data){
        console.log("error")
        console.log(error_data)
    }
})
prgcolorset = [
    'rgba(73,170,30,0.4)',
    'rgba(50, 106, 21,0.4)',
    'rgba(219, 58, 29,0.4)',
    'rgba(150, 58, 29, 0.4)',
    'rgba(60, 206, 209, 0.4)',
    'rgba(60, 157, 209, 0.4)',
    'rgba(60, 90, 209, 0.4)',
    'rgba(280, 243, 36, 0.4)',
    'rgba(230, 243, 36, 0.4)',
]
prgcolorborderset =[
    'rgba(73,170,30,1)',
    'rgba(50, 106, 21,1)',
    'rgba(219, 58, 29, 1)',
    'rgba(150, 58, 29, 1)',
    'rgba(60, 206, 209, 1)',
    'rgba(60, 157, 209, 1)',
    'rgba(60, 90, 209, 1)',
    'rgba(280, 243, 36, 1)',
    'rgba(230,243, 36, 1)',

]
function setchart() {
    var ctx = document.getElementById('myChart').getContext('2d');
    ctx.shadowBlur=20;
    ctx.shadowColor="black";
    var myChart = new Chart(ctx, {
            type: 'line',
            data: {
                labels:{{ enterpYear }} ,
                datasets: [
                  {
                    label: '{{ check|safe }}',
                    data: {{ enterpQTD1 }},
                    //backgroundColor: prgcolorset ,
                    borderColor: prgcolorborderset,
                    borderWidth: 1,
                    fill: false
                  },
                  {
                    label: 'Ent2',
                    data: {{ enterpQTD2 }},
                    //backgroundColor: prgcolorset ,
                    borderColor:'#26c6da',
                    borderWidth: 1,
                    fill: false,
                    borderDash: [10,5]
                  },
                  {
                    label: 'Ent3',
                    data: {{ enterpQTD3 }},
                    //backgroundColor: prgcolorset ,
                    borderColor:'#5c6bc0',
                    borderWidth: 1,
                    fill: false,
                    //borderDash: [10,5]
                  }
                ]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero: true
                }
            }]
        },
        title: {
            display: false,
            text: 'Students per year'
        },

        legend: {
            display: true,
            position:'bottom',
        },
        tooltips: {
            mode: 'x'
        }
    }
});
}

1 Ответ

1 голос
/ 02 июня 2019

сначала давайте начнем с построения. Я рекомендую использовать "https://plot.ly/javascript/",. Это очень простая библиотека JS, и у них есть много примеров. о передаче словаря в представление: перейдите в views.py, там вы можете установить атрибут модели представления для модели, которая содержит данные (если такая модель есть), например:

class SomePage(generic.ListView):
    template_name = 'PagesTemplate'
    model = models.TheModelName

тогда в вашем шаблоне просто используйте теги Django '{% object_list%}' который будет содержать данные словаря, всегда рекомендуется перебирать его так:

{% for singleObject in object_list %}
            {% if not forloop.first %},{% endif %} # this is how you access your loops meta data (such as counters go to https://docs.djangoproject.com/en/2.2/ref/templates/builtins/ for more information #
            {
               someattribute: "{{ singleObject.someattribute }}",
               .
               .
               .
            }
        {% endfor %}

второй вариант, если ваши данные не хранятся с использованием модели: используйте встроенный атрибут представления extra_content и вставьте туда словарь, вот так:

    class SomePage(sometypeofview):
          extra_context = {'your_extra_data': your_extra_data}

затем получите доступ к нему в самом шаблоне так:

<h1>{{ your_extra_data}} </h1>

здесь h1 - просто пример, поместите его в любой тег, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...