Django 和 ChartJS

Ste*_*ith 9 django django-models django-views python-3.x chart.js

我试图了解是否可以将动态数据合并到 Django Chart JS 架构中。我浏览了几个教程,最终让 Django 与 ChartJS 一起工作,当我能够对值进行硬编码然后显示相关图表时,这非常好。我最终想要做的是对我的数据库中的动态数据进行同样的练习。我在 SO 中发现了这个相同的问题,/sf/ask/3330312751/# =但没有人回答。这正是我想要实现的目标。我已经探索了一些序列化器,我需要先序列化数据吗?预先感谢您的想法和反馈。

根据反馈,我已在相关图表中添加了上下文,但数据仍未通过。这是我的观点:

class ChartView(LoginRequiredMixin, TemplateView):

    model = Myobject 
    template_name = 'director/chart.html'

      def get_context_data(self, **kwargs):
          context = super(ChartView, self).get_context_data(**kwargs)  
          myobject = Myobject.objects.filter(field__in=self.request.user.userprofile.field.all())
          print(myobject)
          context['myobject'] = myobject
          return context
Run Code Online (Sandbox Code Playgroud)

我只是得到一个空白屏幕,根本没有图表,这表明有些地方显然有问题。我是否需要对 Javascript 进行其他更改才能告诉它有关该对象的信息?我的假设是否定的,我正在传递此信息查看 context_data。

我也在使用 Ajax,所以我不确定这是否是一个复杂的因素。这是我的 javascript。

<script>
var endpoint = '{% url "myobject:chart_data" %}'
var defaultData = [];
var labels = [];
$.ajax({
    method: "GET",
    credentials: 'same-origin',
    url: endpoint,
    success: function(data){
        labels = data.labels
        defaultData = data.default
        var ctx = document.getElementById("myChart");
        var myChart = new Chart(ctx, {
            type: 'pie',
            data: {
                labels: [{% for i in myobject %}{{ i.labels }},{% endfor %}],
                datasets: [{
                    data: [{% for i in myobject %}{{ i.data }},{% endfor %}]
                    backgroundColor: [
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(153, 102, 255, 0.2)',
                    ],
                    borderColor: [
                        'rgba(255,99,132,1)',
                        'rgba(153, 102, 255, 1)',
                    ],
                    borderWidth: 1
                }]
            }
        })
    },
    error: function(error_data){
        console.log("error")
        console.log(error_data)
    }
})
</script>
Run Code Online (Sandbox Code Playgroud)

Hon*_*ros 9

您不一定需要使用序列化程序来呈现 Chart.js 中的动态数据(尽管您可以根据需要这样做)。您可以像往常一样在适当的位置迭代 Django 上下文变量。下面是一个折线图示例。我会玩这个例子,但这应该向你展示如何使用 Django 上下文变量轻松呈现动态数据。

...
<canvas id="funchart" width="75" height="50"></canvas>                      

<script type="text/javascript">  
     var a = document.getElementById('funchart').getContext('2d');
     var myLineChart = new Chart(a, {
               type: 'line',
               data: {
                   labels:[{% for i in myobject %}{{ i.labels }},{% endfor %}],
                   datasets: [{
                        label:'My Dot',
                        data: [{% for i in myobject %}{{ i.data }},{% endfor %}]
                             }]
                      },
               options:{
                   scales: {
                       xAxes: [{
                           display:true
                              }],
                       yAxes: [{
                           ticks: {
                               beginAtZero:true
                                   }
                               }]
                            }
                        }
                      });
</script>
Run Code Online (Sandbox Code Playgroud)