Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
python:flask:formulaires [2023/11/01 15:43] marclebrun |
python:flask:formulaires [2023/11/10 07:16] (Version actuelle) marclebrun [Traitement] |
||
---|---|---|---|
Ligne 19: | Ligne 19: | ||
actif = BooleanField(u"Actif") | actif = BooleanField(u"Actif") | ||
submit = SubmitField(u"Enregistrer") | submit = SubmitField(u"Enregistrer") | ||
- | cancel = SubmitField(u"Annuler") | ||
</code> | </code> | ||
- | ---- | + | ===== Template ===== |
- | Le formulaire en lui-même peut être écrit directement dans | + | Intégration de ce formulaire dans un template : |
- | un template : | + | |
- | <code html mon_joli_formulaire.html> | + | <code html personne.edit.html> |
- | <h1>Formulaire</h1> | + | <form action="" method="post"> |
- | + | {{ form.hidden_tag() }} | |
- | <form method="POST"> | + | |
<div class="form-group"> | <div class="form-group"> | ||
- | <label for="name">Nom</label> | + | {{ form.nom.label(class="form-label") }} |
- | <input type="text" class="form-control" id="name" name="name"/> | + | {{ form.nom(class="form-input") }} |
</div> | </div> | ||
| | ||
- | ... | + | <div class="form-group"> |
+ | {{ form.prenom.label(class="form-label") }} | ||
+ | {{ form.prenom(class="form-input") }} | ||
+ | </div> | ||
| | ||
- | <button type="submit" class="btn btn-primary">Enregistrer</button> | + | <div class="form-group"> |
+ | {{ form.genre.label(class="form-label") }} | ||
+ | {{ form.genre(class="form-select") }} | ||
+ | </div> | ||
+ | |||
+ | <div> | ||
+ | {{ form.submit(class="btn btn-primary") }} | ||
+ | <a class="btn btn-secondary" href="javascript:history.back()">Annuler</a> | ||
+ | </div> | ||
</form> | </form> | ||
</code> | </code> | ||
- | Ensuite dans une vue on récupère les infos selon que le formulaire | + | ===== Traitement ===== |
- | a été posté (méthode POST) ou pas (méthode GET) : | + | |
+ | Utilisation du formulaire dans un Blueprint. | ||
<code python> | <code python> | ||
- | from flask import render_template, request, redirect, url_for | + | from flask import render_template, url_for, abort, redirect |
+ | from myforms import PersonneEditForm | ||
- | @app.route("/formulaire", methods=["GET", "POST"]) | + | # ... |
- | def test_formulaire(): | + | |
- | if request.method == 'POST': | + | @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 | ||
| | ||
- | nom = request.form['name'] | + | # si l'objet à éditer a bien été lu ou créé |
+ | if personne: | ||
+ | |||
+ | # créer une instance du formulaire | ||
+ | form = PersonneEditForm() | ||
| | ||
- | flash(u"Bonjour %s !" % nom, "success") | + | # si le formulaire a été soumis et validé |
- | return redirect(url_for("home")) | + | if form.validate_on_submit(): |
| | ||
+ | # 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: | else: | ||
- | return render_template("mon_joli_formulaire.html") | + | # l'objet n'existe pas |
+ | abort(404) | ||
</code> | </code> | ||
- | ===== Lister les valeurs du formulaire ===== | ||
- | Pour debug, afficher toutes les valeurs transmises par le formulaire : | ||
- | |||
- | <code python> | ||
- | 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) | ||
- | |||
- | ... | ||
- | </code> | ||