django vue js & Highcharts асинхронная загрузка данных из JSON - PullRequest
0 голосов
/ 24 июня 2018

В настоящее время я использую django, highcharts и JQuery для создания простого веб-приложения для визуализации данных.Я только что перешел из JQuery в Vue Js, и меня смущает, как vue js извлекает данные JSON из определенного URL.Вот мой код:

Шаблон

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Django Highcharts Example</title>
</head>
<body>
  <div id="container" data-url="{% url 'async_chart_data' %}"></div>
  <script src="https://code.highcharts.com/highcharts.src.js"></script>
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script>
    $.ajax({
      url: $("#container").attr("data-url"),
      dataType: 'json',
      success: function (data) {
        Highcharts.chart("container", data);
      }
    });
  </script>
</body>
</html>

Views.py

 def chart_view(request):
     return render(request,'chart.html')

 def chart_data(request):
     dataset = Passenger.objects.values('embarked')\
     .exclude(embarked='')\
     .annotate(total=Count('embarked'))\
     .order_by('embarked')

     port_name = dict()
     for choices_tuple in Passenger.PORT_CHOICES:
         port_name[choices_tuple[0]] = choices_tuple[1]

     #Hicharts visualization config
     pie_chart = {
        'chart' : {'type':'pie'},
        'title' : {'text' : 'PELABUHAN'},
        'series': [{
           'name' : 'Tempat Berangkat',
           'data' : list(map(lambda row: {'name' : port_name[row['embarked']],
            'y' : row['total']},dataset))
       }]
     }

     return JsonResponse(pie_chart)

Models.py

 from django.db import models

 class Passenger(models.Model):
       MALE = 'M'
       FEMALE = 'F'

      SEX_CHOICES = (
         (MALE, 'male'),
         (FEMALE, 'female')
       )

       CHERBOURG = 'C'
       QUEENSTOWN = 'Q'
       SOUTHAMPTON = 'S'

        PORT_CHOICES = (
           (CHERBOURG, 'Cherbourg'),
           (QUEENSTOWN, 'Queenstown'),
           (SOUTHAMPTON, 'Southampton'),
       )

      name = models.CharField(max_length=100, blank=True)
      sex = models.CharField(max_length=1, choices=SEX_CHOICES)
      survived = models.BooleanField()
      age = models.FloatField(null=True)
      ticket_class = models.PositiveSmallIntegerField()
      embarked = models.CharField(max_length=1, choices=PORT_CHOICES)

      def __str__(self):
         return self.name

Я хочу изменить использование JQuery для извлечения данных JSONVue JS.Как я могу это сделать?

РЕДАКТИРОВАТЬ: я уже сделал с этой проблемой.Я столкнулся с другой проблемой на Здесь

1 Ответ

0 голосов
/ 24 июня 2018

Дело закрыто.Я могу добиться этого, играя с хуями Vue JS жизненного цикла.Однако это все еще достаточно медленно, чтобы загрузить страницу.нужно (от 4 до 7 секунд), но это работает.Вот мой шаблон.

<!DOCTYPE html>
<html>
<head>
	<title>Using Vue Axios</title>
	<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
	<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
	<script src="https://code.highcharts.com/highcharts.src.js"></script>
</head>
<body>
	<div id="app">[[dataTitanic]]</div>
	<h1>The Chart Is Shown Below : </h1>
	<div id="container"></div>
	<script type="text/javascript">
		var url = "{% url 'async_chart_data' %}";
		var app = new Vue({
			delimiters : ['[[',']]'],
			el : '#app',
			data(){
				return {
					dataTitanic : null,
				}
			},
			mounted(){
				axios
				  .get(url)
				  .then(response => (this.dataTitanic = response['data']))
			},
			beforeUpdate(){
				Highcharts.chart('container',this.dataTitanic)
			}
		})
	</script>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...