web-dev-qa-db-fra.com

Obtenir une valeur de la balise select en utilisant flask

Je suis nouveau sur Flask et je ne parviens pas à obtenir la valeur de mon tag de sélection. J'ai essayé request.form['comp_select'], Qui renvoie une requête incorrecte. Toutefois, lorsque j'essaie d'utiliser request.form.get('comp_select'), ma page de retour renvoie une liste vide "[]".

Mon html:

<form class="form-inline" action="{{ url_for('test') }}">
  <div class="form-group">
    <div class="input-group">
        <span class="input-group-addon">Please select</span>
            <select name="comp_select" class="selectpicker form-control">
              {% for o in data %}
              <option value="{{ o.name }}">{{ o.name }}</option>
              {% endfor %}                                              
            </select>
    </div>
    <button type="submit" class="btn btn-default">Go</button>
  </div>
</form>

Mon app.py:

@app.route("/test" , methods=['GET', 'POST'])
def test():
    select = request.form.get('comp_select')
    return(str(select)) # just to see what select is

Désolé par avance si ma mise en forme est désactivée pour la publication (également nouvelle pour Stack Overflow).

27
qwertyuip9

Il est difficile de savoir avec certitude à partir de ce que vous avez fourni, mais je pense que vous devez ajouter method="POST" À votre élément <form>.

Depuis le doc de la fiole pour l'objet request :

Pour accéder aux données de formulaire (données transmises dans une requête POST ou PUT)), vous pouvez utiliser l'attribut de formulaire. ... Pour accéder aux paramètres soumis dans l'URL (? Clé = valeur), vous pouvez utiliser attribut args.

Ainsi, si vous envoyez vos formulaires via POST, utilisez request.form.get(). Si vous envoyez vos formulaires via GET, utilisez request.args.get().

Cette application se comporte comme vous le souhaitez:

flask_app.py:

#!/usr/bin/env python
from flask import Flask, flash, redirect, render_template, \
     request, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return render_template(
        'index.html',
        data=[{'name':'red'}, {'name':'green'}, {'name':'blue'}])

@app.route("/test" , methods=['GET', 'POST'])
def test():
    select = request.form.get('comp_select')
    return(str(select)) # just to see what select is

if __name__=='__main__':
    app.run(debug=True)

templates/index.html

<form class="form-inline" method="POST" action="{{ url_for('test') }}">
  <div class="form-group">
    <div class="input-group">
        <span class="input-group-addon">Please select</span>
            <select name="comp_select" class="selectpicker form-control">
              {% for o in data %}
              <option value="{{ o.name }}">{{ o.name }}</option>
              {% endfor %}
            </select>
    </div>
    <button type="submit" class="btn btn-default">Go</button>
  </div>
</form>
28
Robᵩ