J'ai donc essayé de créer un graphique en chandeliers à l'aide de Highcharts dans Django, mais je ne peux pas afficher le graphique sur la page Web, mais il affiche une liste JSON des données récupérées.
J'utilise l'API d'iexcloud pour obtenir des données historiques
Voici ma logique : Fichier View.py :
def candlestick_chart_data(request): api_key = 'my_api_key' stock_data = get_historical_data( "AAPL", start="2023-01-01", end="2023-05-05", output_format="pandas", token=api_key) stock_data_array = [{ 'x': date.isoformat(), 'open': row['open'], 'high': row['high'], 'low': row['low'], 'close': row['close'] } for date, row in stock_data.iterrows()] return JsonResponse(stock_data_array, safe=False)
Mon modèle, qui est chandelier_chart.html
{% extends 'base.html' %} {% block content %} {% block home_css %} <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highcharts/9.2.1/css/highcharts.css" integrity="sha512-bwK5pU3LlQlAocA38e/L90g86uJUZVvJEnpnT5ZyL0j3frzAKcJbhdTl0z0W4pVfTqBqftbX2y/3D2wLxbt6uQ==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <script src="https://code.highcharts.com/highcharts.js"></script> <script src="https://code.highcharts.com/modules/stock.js"></script> <script src="https://code.highcharts.com/modules/exporting.js"></script> <script src="https://code.highcharts.com/modules/export-data.js"></script> {% endblock %} <div id="container" style="height: 500px; width: 100%;"></div> <script> const dataURL = '{% url "candlestick-chart" %}'; /** * Load new data depending on the selected min and max */ function afterSetExtremes(e) { const { chart } = e.target; chart.showLoading('Loading data from server...'); fetch(`${dataURL}?start=${Math.round(e.min)}&end=${Math.round(e.max)}`) .then(res => res.ok && res.json()) .then(data => { console.log(data) chart.series[0].setData(data); chart.hideLoading(); }).catch(error => console.error(error.message)); } fetch(dataURL) .then(res => res.ok && res.json()) .then(data => { data.forEach((d) => { d.x = new Date(d.x); }); // create the chart Highcharts.stockChart('container', { chart: { type: 'candlestick', zoomType: 'x' }, navigator: { adaptToUpdatedData: false, series: { data: data } }, scrollbar: { liveRedraw: false }, title: { text: 'AAPL history by the minute from 1998 to 2011', align: 'left' }, subtitle: { text: 'Displaying 1.7 million data points in Highcharts Stock by async server loading', align: 'left' }, rangeSelector: { buttons: [{ type: 'hour', count: 1, text: '1h' }, { type: 'day', count: 1, text: '1d' }, { type: 'month', count: 1, text: '1m' }, { type: 'year', count: 1, text: '1y' }, { type: 'all', text: 'All' }], inputEnabled: false, // it supports only days selected: 4 // all }, xAxis: { events: { afterSetExtremes: afterSetExtremes }, minRange: 3600 * 1000 // one hour }, yAxis: { floor: 0 }, series: [{ data: data, dataGrouping: { enabled: false } }] }); }).catch(error => console.error(error.message)); </script> {% endblock %}
Et mon chemin url si besoin :
path('candlestick-chart-data/', views.candlestick_chart_data, name='candlestick-chart'),
C'est le résultat que j'obtiens sur la page Web image Web de l'hôte local
J'ai essayé de mettre des instructions console.log dans le code, j'ai essayé d'imprimer les données dans le terminal, tout fonctionne bien, mais je ne comprends pas pourquoi le graphique n'apparaît pas dans la page Web si tout fonctionne bien
J'irais avec la suggestion de @kikon - il serait utile de a) voir le code source réel de la page localhost en cours de génération, et b) de regarder la sortie de la console pour voir si des erreurs JS sont générées. Sans les voir, je crains de ne pas pouvoir être d'une grande aide ici.
Cependant, une chose qui pourrait être pertinente est que vous êtes actuellement dans des balises HTML
<body>
中加载<script/>
.C'est un peu un anti-modèle car cela signifie votre constructeur Highcharts (
Highcharts.stockChart()
) 可能会在相关 Highcharts 模块有机会加载之前执行,这将在控制台中抛出ReferenceError
.Un meilleur modèle serait en
<head/>
块中包含<script/>
标签,并使用defer
属性,然后在 DOM 相关事件上触发 Highcharts 构造函数,例如DOMContentLoaded
ou similaire (les événements exacts peuvent dépendre de votre cas/flux d'utilisation spécifique).Un autre modèle pour accomplir la même tâche consiste à utiliser une fonction asynchrone qui réessaye (en attrapant le
ReferenceError
pertinent) jusqu'à ce que le script soit chargé.Bien sûr, ce ne sont que des suppositions : il est difficile de déterminer exactement ce qui se passe ici sans regarder la sortie HTML et la sortie de la console.
BTW, si vous essayez d'intégrer Highcharts dans Django, vous pouvez également consulter la Highcharts for Python toolkit qui vient de sortir en tant que plugin payant pour Highcharts (divulgation complète, je suis le créateur de Highcharts pour Python), il peut simplifier certaines de vos intégrations de vues Django. p>
En attendant, j'espère que cette réponse vous aidera à diagnostiquer/résoudre le problème, et si vous partagez plus de détails, je serai heureux de modifier cette réponse avec un diagnostic/suggestion plus précis.