Wertübergabe Http Django

Django, Flask, Bottle, WSGI, CGI…
Antworten
payno4
User
Beiträge: 7
Registriert: Samstag 22. Februar 2020, 22:51

Guten Tag,

ich versuche eine Liste per Shortcut .render zu übergeben. Allerdings ist diese immer leer.

Code: Alles auswählen

def serachView(request):
    filteredObjects = []
    if request.method == 'POST':
        filters = Data(
        .
        .
        .
        )
        filteredObjects = filters.search()
        print(filteredObjects)
    print(filteredObjects)
    return render(request, 'searchengine/index.html',  {'filteredObjects': filteredObjects})
Also an meiner Methode filters.search() kann es nicht liegen, denn hier bekomme ich das zurück, was ich zurück bekommen soll.
Es liegt eher daran, dass die Liste zwar bei dem Fall 'POST' richtig zurückgegeben wird, allerdings dadurch, dass die Seite nochmal geladen wird (window.location.reload() in JavaScript) natürlich die Seite neu angefordert und somit die leere initialisierte Liste mitgegeben wird. Leider habe ich nicht gefunden, wie man mit sowas umgeht.

Code: Alles auswählen

<QuerySet [<Hotel: Hotel object (1)>, <Hotel: Hotel object (2)>, <Hotel: Hotel object (4)>, <Hotel: Hotel object (5)>, <Hotel: Hotel object (6)>, <Hotel: Hotel object (7)>, <Hotel: Hotel object (8)>, <Hotel: Hotel object (9)>, <Hotel: Hotel object (10)>, <Hotel: Hotel object (11)>, <Hotel: Hotel object (13)>, <Hotel: Hotel object (14)>, <Hotel: Hotel object (15)>, <Hotel: Hotel object (16)>, <Hotel: Hotel object (17)>, <Hotel: Hotel object (18)>, <Hotel: Hotel object (19)>, <Hotel: Hotel object (20)>, <Hotel: Hotel object (22)>, <Hotel: Hotel object (23)>, '...(remaining elements truncated)...']>
[23/Oct/2022 09:00:52] "POST /searchengine/ HTTP/1.1" 200 233379
[]
[23/Oct/2022 09:00:52] "GET /searchengine/ HTTP/1.1" 200 5691
Ich hoffe ihr könnt mir weiterhelfen :)

Mit freundlichen Grüßen
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@payno4: Namenskonvention in Python ist klein_mit_unterstrichen, also `search_view`, `filtered_objects`, und so weiter.

Das umgeht man in dem man nicht noch mal einen GET-Aufruf macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
payno4
User
Beiträge: 7
Registriert: Samstag 22. Februar 2020, 22:51

__blackjack__ hat geschrieben: Sonntag 23. Oktober 2022, 11:05 @payno4: Namenskonvention in Python ist klein_mit_unterstrichen, also `search_view`, `filtered_objects`, und so weiter.

Das umgeht man in dem man nicht noch mal einen GET-Aufruf macht.
oke, danke, dann werd ich mich mal dran halten.
Allerdings funktioniert das auch nicht so recht. Also ich hab mir mal angeschaut, was übermittelt wird und meine Daten sind zwar da, allerdings werden die ja dann nicht angezeigt, wenn man die Seite nicht mit den erhalten Daten aktualisert. Gibt es dafür dann auch einen bestimmt Umgang?

Meine HTML Datei:

Code: Alles auswählen

{% load static %}
<html>
    <!-- <head>: Dokumentinformationen -->
    <head>
        <!-- Titel in der Tapleiste -->
        <title>Searchengine</title>
        <!-- Alphabet -->
        <meta charset="UTF-8" />
        <!-- Stylesheet CSS-->
        <link rel="stylesheet" type="text/css" href="{% static 'searchengine/styles.css' %}">
        <!-- Anpassung an andere Geräte -->
        <meta id="viewport" content="width=device-width, initial-scale=1.0" />
    </head>
    <body>
        <header class="mitte">
            <img width="100" src="{% static 'searchengine/images/scholarship_logo.jpg' %}" alt="Logo Scholarship">
        </header>
        <div id="teaser">
            <img src="{% static 'searchengine/images/beach.jpg' %}" alt="Strand in der Karibik">
        </div>
        <!-- Hier DIV für das eigentliche Projekt -->
        <div class="filter">
            <!-- Abflughafen -->
            <input type="text" id="abflughafen" list="airports" maxlength="3" minlength="2" placeholder="Abflughafen" required>
                <datalist id="airports">
                    <option value="MUC"> München </option>
                    <option value="HAM"> Hamburg </option>
                </datalist>
                *
                *
                *
            </select>
            <input type="submit" id="submit" onclick="sendRequest()">
        </div>
        <div> Hier die Suche einblenden
             siehe: {{filteredObjects}}
                {%for item in filteredObjects %}
                
                    <p> Das Objekt: {{item}} </p>
                
                {% endfor %}

		*
		*
		*
        </section>
    </body>

    <!-- Java-Script -->
    <script>
        /*Funktion*/
        function sendRequest(){
            /* referenzen zum input*/
            let abflughafen = document.querySelector("#abflughafen").value;
            *
            *
            *

            /*übergabetoken*/
            let token = '{{ csrf_token }}';

            /* Übergabeform */
            let formData = new FormData();
            formData.append('abflughafen', abflughafen);
            *
            *
            *
            
            formData.append('csrfmiddlewaretoken', token);
            /*Übergabe*/
            fetch('/searchengine/', {
                method: 'POST',
                body: formData
            }).then( () => {
               /* window.location.reload(true); */
            });
        }
    </script> 
</html>
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@payno4: Entweder Du lässt das mit dem JavaScript und `fetch` weg, oder Du machst für die Daten eine eigene Route die *die Daten* liefert statt einer Webseite, und erweiterst das JavaScript das es die Daten dann in die Webseite einbaut. Mittelweg könnte noch sein HTML-Fragmente mit den Daten auf dem Server zu rendern und dass dann per JavaScript in die Webseite einzubauen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@payno4: warum benutzt Du `fetch` um dann doch die ganze Seite per reload neu zu laden?
Antworten