Загрузка файла Javascript (Google Charts) в html с использованием django

Я изо всех сил пытаюсь загрузить диаграмму Google из статического файла в html с помощью Django. Я могу загружать другие файлы javascript, используя {% load static %}. Кроме того, я могу отобразить диаграмму, если вставлю файл javascript в файл html:

{% extends '_base.html' %}

{% load static %}


{% block content %}
  <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
  <script type = "text/javascript" src = "https://www.gstatic.com/charts/loader.js"></script>

  <!-- JumboTron -->
  <div class = "container">
      <div class = "center-block">
        <div id = "curve_chart"></div>
      </div>
  </div>

  <script type = "text/javascript" id=demo>
    let data_from_django = {{ object_list|safe }};
    CHART WORKING    
    function drawChart() {
      var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
      chart.draw(data, options);

      }
  </script>

{% endblock %}

Однако, если я вставлю код javascript в <script type = "application/json" src = "{% static 'js/load_data.js' %}"></script> и загрузлю static, код никогда не будет выполнен.

Я попытался поместить файл javascript также в заголовок, но он все еще не загружается. Любые идеи о чем-то, что я мог упустить?

Обновлять

Смотрите load_data.js :

$(function () {

let data_from_django = {{ object_list|safe }};
let dataValues=data_from_django["dataValues"];
let dataBacktest=data_from_django["dataBacktest"];

var googledata = [];
for(let i=0, size=dataValues.length; i<size; i++){
  var kline=dataValues[i]
  var value=kline["average"];  
  var date = new Date(kline["date"]);
  var googlekline = [date, value];
  googledata.push(googlekline);
}

google.charts.load('current', {
  'packages': ['corechart']
});
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var data = new google.visualization.DataTable();
  data.addColumn('datetime', 'Date');
  data.addColumn('number', 'value');
  data.addColumn({
    type: 'string',
    role: 'annotation'

  data.addRows(googledata);

  var options = {
    title: 'Price Chart',
    hAxis: {
      format: 'MMM, dd, yyyy, HH:mm'
    },
    explorer: {
      actions: ['dragToZoom', 'rightClickToReset'],
      axis: 'horizontal',
      maxZoomIn: 100.0
    },
    legend: {
      position: 'bottom'
    },
    width: $(window).width()*0.75,
    height: $(window).height()*0.5
  };

  var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
  chart.draw(data, options);

  }

});

Если вы просматриваете исходный код своего файла, правильно ли ваш тег {% static %} указывает на местоположение вашего файла .js? Если да, то правильно ли он отображается при переходе по URL-адресу вашего файла .js?

Sam 26.02.2019 20:20

@ Сэм, ты прав! Я не понимал, что, изменив его на application/json, файл больше не загружается. Однако, как упоминалось в комментарии к ответу от @Sourav, данные django загружаются неправильно. Я получаю ошибку Uncaught SyntaxError: неожиданный токен {. А то ничего не отображается

Alvaro 26.02.2019 20:57

Я думаю, что эта ошибка возникает из-за строки, содержащей переменную вашего шаблона: {{ object_list|safe }}. Поскольку вы используете включение, Django неправильно заменяет {{ object_list|safe }} объектом, и ваш файл Javascript читает его буквально. Чтобы исправить это, вам нужно установить переменную js в вашем стандартном файле (без включения), а затем передать ее во включенный скрипт.

Sam 26.02.2019 21:11

это логично, я проверю

Alvaro 26.02.2019 21:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь возникают две проблемы:

  1. Вы включаете файл как «application/json», когда вы должны включать его как «text/javascript». <script type = "text/javascript" src = "{% static 'js/load_data.js' %}"></script>
  2. Вы пытаетесь использовать переменную шаблона Django внутри включенного файла .js. Django не передает контекст шаблона в ваш файл .js, поэтому он отображается как фактический код, а Javascript выдает ошибку (let data_from_django = {{ object_list|safe }}; недействителен Javascript). Вы должны определить переменную в своем базовом файле, используя тег шаблона Django, а затем передать эту переменную включенному сценарию.

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