web-dev-qa-db-fra.com

Passer une valeur d'un menu déroulant à un modèle Flask

Je rencontre un problème en transmettant un élément sélectionné d'un menu déroulant HTML à une requête SQL.

Je ne sais pas exactement quel concept manque dans mon code pour que cela fonctionne. La plupart des exemples que j'ai trouvés se trouvent dans PHP et je ne sais pas comment le traduire en Python.

Voici le scénario. J'utilise Flask et Sqlite et je tente de laisser l'utilisateur sélectionner un élément dans un menu déroulant HTML. L'élément sélectionné dans le menu déroulant sera utilisé dans une requête SQL pour extraire des informations d'une base de données puis afficher ces résultats sur une nouvelle page.

Par exemple, l'utilisateur sélectionne "Rouge" dans une liste déroulante comportant 3 options (Rouge, Bleu, Vert) et clique sur un bouton d'envoi. "Red" sera passé à une requête SQL dans mon fichier app.py qui récupérera toutes les données des lignes où color = "Red". Les données récupérées seront ensuite affichées sur /results.html.

Je crois que mon problème est que je n'attribue pas correctement une valeur aux éléments de mon menu déroulant, puis que je transmets cette valeur à mon code Python qui exécute la requête SQL. Ceci est mon hypothèse sur la façon dont cela devrait fonctionner, mais il se peut que je manque quelque chose de plus grand ici.

J'ai essayé beaucoup de bouts de HTML pour que cela fonctionne, mais je ne suis même pas sûr que c'est là que mon problème se pose. Lorsque je clique sur «Soumettre», je prends la nouvelle page, mais rien dans la base de données n'est affiché.

Voici mon code, pour mes 2 vues ('/' & 'results.html') et mon code Python:

@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)

Voici la vue où les menus déroulants existent

<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>

Voici la vue où les résultats de la sélection de "Rouge" doivent être affichés

% 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

Vous devez mettre votre select dans la form.

<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>

Un moyen encore meilleur de déclarer la form serait

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

Comme mentionné par @dim, placez la sélection dans le formulaire et la valeur choisie peut être obtenue à l'aide de request.form['Item_1']. Cependant, l’objet de la requête est une sélection, je préférerais donc utiliser get au lieu de POST. À partir de wiki, http://en.wikipedia.org/wiki/POST_(HTTP) , POST est utilisé lorsque

 La méthode de demande POST est conçue pour demander à un serveur Web d'accepter les données contenues dans le corps du message de demande pour le stockage. [1] Il est souvent utilisé lors du téléchargement d’un fichier ou lors de la soumission d’un formulaire Web rempli. 

Donc, je préférerais plutôt GET, qui peut être utilisé pour interroger la base de données. Lorsque vous utilisez GET, Item_1 peut être passé en tant que paramètre de requête et obtenu avec flask.request.args

0
Veerabahu