web-dev-qa-db-de.com

Übergeben eines Werts aus einem Dropdown-Menü an eine Kolbenvorlage

Ich habe ein Problem beim Übergeben eines Elements, das aus einem HTML-Dropdown-Menü ausgewählt wurde, an eine SQL-Abfrage.

Ich bin mir nicht ganz sicher, welches Konzept in meinem Code fehlt, damit dies funktioniert. Die meisten Beispiele, die ich gefunden habe, sind in PHP und ich bin nicht sicher, wie ich es in Python übersetzen soll.

Hier ist das Szenario. Ich verwende Flask und SQLite und versuche, den Benutzer ein Element aus einem HTML-Dropdown-Menü auswählen zu lassen. Das im Dropdown-Menü ausgewählte Element wird in einer SQL-Abfrage verwendet, um Informationen aus einer Datenbank abzurufen und diese Ergebnisse dann auf einer neuen Seite anzuzeigen.

In einem Beispiel wählt der Benutzer "Rot" aus einer Dropdown-Liste mit drei Optionen (Rot, Blau, Grün) aus und klickt auf eine Senden-Schaltfläche. "Rot" wird an eine SQL-Abfrage in meiner app.py-Datei übergeben, die alle Daten aus Zeilen mit color = "Rot" abruft. Diese abgerufenen Daten werden dann in /results.html angezeigt.

Ich glaube, mein Problem ist, dass ich den Elementen in meinem Dropdown-Menü keinen korrekten Wert zuordne und diesen Wert dann an meinen Python-Code weitergebe, in dem die SQL-Abfrage ausgeführt wird. Dies ist meine Vermutung, wie dies funktionieren sollte, aber hier fehlt mir möglicherweise etwas Größeres.

Ich habe viele HTML-Teile ausprobiert, damit dies funktioniert, bin mir aber nicht sicher, ob dort mein Problem auftritt. Wenn ich "Submit" drücke, nehme ich die neue Seite, aber nichts aus der Datenbank wird angezeigt

Hier ist mein Code für meine 2 Aufrufe ('/' & 'results.html') und meinen Python-Code:

@app.route('/results.html', methods=['GET','POST'])
def results():
    g.db = connect_db()

    cur = g.db.execute("SELECT * FROM all_items WHERE name = '{}'".format('Red'))
    posts = [dict(item=row[0], name=row[1]) for row in cur.fetchall()]
    g.db.close()
    return render_template('results.html', posts=posts)

Hier sehen Sie, wo die Dropdown-Menüs existieren

<select name="Item_1">
    <option value="Red">Red</option>
    <option value="Green">Green</option>        
</select>

<form name="Item_1" action="results.html" method='POST'>
    <button type="submit">Compare!</button>
</form>

Hier ist die Ansicht, in der die Ergebnisse der Auswahl von "Rot" angezeigt werden sollen

% extends "template.html" %}
{% block content %}
<h2>Results</h2>

{% for p in posts %}
    <strong>Item:</strong> {{ p.item }}
    <strong>Name:</strong> {{ p.name}}  
{% endfor %}
{% endblock %}
9
Alex

Sie müssen Ihre select in die form einfügen.

<form name="Item_1" action="results.html" method='POST'>
    <select name="Item_1">
        <option value="Red">Red</option>
        <option value="Green">Green</option>        
    </select>
    <button type="submit">Compare!</button>
</form>

Ein noch besserer Weg, die form zu deklarieren, wäre

<form name="Item_1" action="{{ url_for('results') }}" method="POST">
7
dirn

Wie von @dim erwähnt, setzen Sie die Auswahl in ein Formular und der gewählte Wert kann mit request.form['Item_1'] ermittelt werden. Da es sich bei dem abgefragten Element jedoch um ein Select handelt, würde ich die Verwendung von get anstelle von POST bevorzugen. Aus dem Wiki wird http://en.wikipedia.org/wiki/POST_(HTTP) , POST verwendet, wenn

 Mit der Anforderungsmethode POST wird angefordert, dass ein Webserver die im Hauptteil der Anforderungsnachricht enthaltenen Daten zum Speichern akzeptiert. [1] Es wird häufig beim Hochladen einer Datei oder beim Senden eines ausgefüllten Webformulars verwendet. 

Daher bevorzuge ich GET, mit dem die Datenbank abgefragt werden kann. Bei Verwendung von GET kann Item_1 als Anforderungsparameter übergeben und mit flask.request.args abgerufen werden.

0
Veerabahu