Outils pour utilisateurs

Outils du site


Panneau latéral

Plan du Site:

python:flask:formulaires

Ceci est une ancienne révision du document !


Formulaires

Classe formulaire

Définition du formulaire dans une classe.

from flask_wtf import FlaskForm
from wtforms import StringField, SelectField, BooleanField, SubmitField
from wtforms.validators import DataRequired
 
class PersonneEditForm(FlaskForm):
    nom    = StringField(u"Nom", validators=[DataRequired()])
    prenom = StringField(u"Prénom", validators=[DataRequired()])
    genre  = SelectField(u"Genre", choices=[
        ('m', u"Masculin"),
        ('f', u"Féminin"),
    ])
    actif  = BooleanField(u"Actif")
    submit = SubmitField(u"Enregistrer")
    cancel = SubmitField(u"Annuler")

Template

Intégration de ce formulaire dans un template :

personne.edit.html
<form action="" method="post">
    {{ form.hidden_tag() }}
    <div class="form-group">
        {{ form.nom.label(class="form-label") }}
        {{ form.nom(class="form-input") }}
    </div>
    <div class="form-group">
        {{ form.prenom.label(class="form-label") }}
        {{ form.prenom(class="form-input") }}
    </div>
    <div class="form-group">
        {{ form.genre.label(class="form-label") }}
        {{ form.genre(class="form-input") }}
    </div>
    {{ form.submit(class="btn btn-primary") }}
    {{ form.cancel(class="btn btn-secondary") }}
</form>

Traitement

Utilisation du formulaire dans un Blueprint.

from flask import render_template, url_for, abort, redirect
from myforms import PersonneEditForm
 
# ...
 
@personnes.route("/<int:id>/edit", methods=['GET', 'POST'])
def edit(id=0):
    if id == 0:
        personne = # création d'un nouvel objet
    else:
        personne = # lecture d'un l'objet existant
 
    # si l'objet à éditer a bien été lu ou créé
    if personne:
 
        # créer une instance du formulaire
        form = PersonneEditForm()
 
        # si le formulaire a été soumis
        if form.is_submitted():
 
            # si on a validé avec le bouton "Annuler"
            if form.cancel.data:
                return redirect(url_for('personnes.index'))
 
            # si on a validé avec le bouton "Enregistrer"
            if form.submit.data:
                # si tous les champs du formulaire sont valides
                if form.validate():
                    # enregistrer l'objet
                    personne.nom    = form.nom.data
                    personne.prenom = form.prenom.data
                    personne.genre  = form.genre.data
                    if id == 0:
                        # si 0 on est dans l'ajout d'un nouvel objet
                        db.session.add(personne)
                    # valider l'enregistrement dans la db
                    db.session.commit()
 
                    # rediriger vers l'index
                    return redirect(url_for('personnes.index'))
 
        # sinon il faut le remplir et l'afficher
        form.nom.data    = personne.nom
        form.prenom.data = personne.prenom
        form.genre.data  = personne.genre
        return render_template("personne.edit.html", form = form)
 
    else:
        # l'objet n'existe pas
        abort(404)

Le formulaire en lui-même peut être écrit directement dans un template :

mon_joli_formulaire.html
<h1>Formulaire</h1>
 
<form method="POST">
    <div class="form-group">
        <label for="name">Nom</label>
        <input type="text" class="form-control" id="name" name="name"/>
    </div>
 
    ...
 
    <button type="submit" class="btn btn-primary">Enregistrer</button>
</form>

Ensuite dans une vue on récupère les infos selon que le formulaire a été posté (méthode POST) ou pas (méthode GET) :

from flask import render_template, request, redirect, url_for
 
@app.route("/formulaire", methods=["GET", "POST"])
def test_formulaire():
    if request.method == 'POST':
 
        nom = request.form['name']
 
        flash(u"Bonjour %s !" % nom, "success")
        return redirect(url_for("home"))
 
    else:
        return render_template("mon_joli_formulaire.html")

Lister les valeurs du formulaire

Pour debug, afficher toutes les valeurs transmises par le formulaire :

from flask import request
 
@app.route("/formulaire", methods=["GET", "POST"])
def test_formulaire():
 
    if request.method == 'POST':
 
        for field, value in request.form.items():
            print(field, value)
 
...
python/flask/formulaires.1698855131.txt.gz · Dernière modification: 2023/11/01 16:12 par marclebrun