fetch skript nimmt id nicht vom button an

Django, Flask, Bottle, WSGI, CGI…
Antworten
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

Hey Leute,

Ich würde gerne per Button historische Kurse von der jeweiligen Aktie in ein Chart darstellen wollen. Mein Template sieht so aus:

Code: Alles auswählen

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Aktienauswahl</title>
    <!-- Bootstrap CSS einbinden -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <!-- Chart.js einbinden -->
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        .card-deck .card {
            margin-bottom: 30px;
        }
        .historical-chart-container {
            display: none;
            margin-top: 30px;
        }
    </style>
</head>
<body>
    <div class="container my-4">
    <a href="{% url 'home' %}" class="btn btn-secondary">Home</a>
        <h2 class="text-center mb-4">Wähle 5 Aktien aus dem DAX 40</h2>
        <form method="post" class="card-deck">
            {% csrf_token %}
            {% if form.non_field_errors %}
            <div class="alert alert-danger" role="alert">
                {% for error in form.non_field_errors %}
                    {{ error }}
                {% endfor %}
            </div>
        {% endif %}
{% for aktie in form.aktien %}
    <div class="col-md-4">
        <div class="card">
            <div class="card-body">
                <h5 class="card-title">{{ aktie.label }} </h5>
                <div class="form-check">
                    {{ aktie }}
                    <label class="form-check-label" for="{{ aktie.id_for_label }}"></label>
                </div>
                <!-- Setze das id-Attribut des Buttons auf das ticker_symbol der Aktie -->
              <button type="button" class="btn btn-info" onclick="loadHistoricalData(this)" data-ticker-symbol="{{ aktie.ticker_symbol }}">Historische Kurse</button>
            </div>
        </div>
    </div>
    {% if forloop.counter|divisibleby:3 %}<div class="w-100"></div>{% endif %}
{% endfor %}

            <div class="w-100"></div>
            <button type="submit" class="btn btn-primary mt-3">Speichern und weiter</button>
        </form>
    </div>

    <div class="container historical-chart-container">
        <canvas id="historicalChart" width="400" height="400"></canvas>
    </div>

    <!-- Optional JavaScript -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

<script>
    function loadHistoricalData(element) {
    var tickerSymbol = element.getAttribute('data-ticker-symbol');
    console.log('Fetching data for:', tickerSymbol);
    fetch(`/historische_kurse/${tickerSymbol}/`)
        .then(response => response.json())
        .then(data => {
                var ctx = document.getElementById('historicalChart').getContext('2d');
                if(window.historicalChart) {
                    window.historicalChart.destroy();
                }
                window.historicalChart = new Chart(ctx, {
                    type: 'line',
                    data: {
                        labels: data.dates, // Daten für die X-Achse
                        datasets: [{
                            label: 'Historischer Kurs von ' + buttonId,
                            data: data.prices, // Historische Kursdaten
                            backgroundColor: 'rgba(0, 123, 255, 0.2)',
                            borderColor: 'rgba(0, 123, 255, 1)',
                            borderWidth: 1
                        }]
                    },
                    options: {
                        scales: {
                            y: {
                                beginAtZero: false
                            }
                        }
                    }
                });
                document.getElementById('historicalChart').style.display = 'block';
            })
            .catch(error => console.error('Fehler beim Laden der historischen Daten:', error));
    }
</script>

</body>
</html>
</body>
</html>
jedoch wenn ich jetzt den Button klicke kommt ein 404 Error :"GET /historische_kurse// HTTP/1.1" 404 3819
normalerweise müsste nach dem historische_kurse/ *** / bei den sternen der jeweiliger Ticker sein für yfinance. Wenn ich aber manuell oben den Ticker eingebe dann kommen die Daten. Wenn ich manuell den ticker eingebe in dem fretch crashd das chart. Hat jemand ideen ?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Offensichtlich ist `aktie.ticker_symbol` der leere String. Das müßtest Du ha genauso in der Console sehen.
Woher diese Daten kommen, zeigst Du nicht, kann man also nichts dazu sagen.
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

Die Daten kommen

Code: Alles auswählen

class Aktie(models.Model):
    name = models.CharField(max_length=100, default='')
    ticker_symbol = models.CharField(max_length=10, default='')

    def __str__(self):
        return f"{self.name} ({self.ticker_symbol})"
Das formular dafür:

Code: Alles auswählen

class AktienAuswahlForm(forms.Form):
    aktien = forms.ModelMultipleChoiceField(
        queryset=Aktie.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )
Sorry für die fehlenden Informationen
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann scheint wohl in Deiner Datenbank im Feld ticker_symbol nichts zu stehen.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei da IMHO auch ein bisschen komisch ist, dass Default für Name und Tickersymbol die leere Zeichenkette ist. Welche Aktie in dem System hat denn nicht einmal einen Namen und gibt es wirklich welche ohne Symbol? Defaultwerte sind ja nur sinnvoll wenn es die auch tatsächlich geben kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

um Doppeleinträge zu vermeiden sollten IMHO auch der Name oder das Tickersymbol mindestens eine Unique-Constrain haben bzw. einen von beiden direkt zum Primary Key für die Tabelle machen.
Und lt. Wikiepedia ist das Tickersymbol max 6 Zeichen lang. Und wenn man es ganz exakt machen möchte kann man für das Feld noch einen Validator schreiben, der auf gültige Zeichen prüft. Wenn ich das richtig verstehe kann das Tickersymbol nur aus (Groß?) Buchstaben und den Zahlen von 0-9 bestehen.

Gruß, noisefloor
Antworten