Maison  >  Questions et réponses  >  le corps du texte

Highcharts dans Django : affichez les données JSON au lieu des graphiques sur les pages Web

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

P粉310931198P粉310931198181 Il y a quelques jours308

répondre à tous(1)je répondrai

  • P粉420958692

    P粉4209586922024-04-03 00:20:33

    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.

    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.

    répondre
    0
  • Annulerrépondre