Le formulaire¶
Objectif : ajouter une page d'ajout de contact, servie par le contrôleur, avec les composants de saisie.
Ce que vous allez apprendre : les macros de components/forms.html et le branchement route + contrôleur + vue du formulaire.
Les macros produisent les champs ; la balise <form> et le jeton CSRF restent à votre charge.
La route et le contrôleur¶
Ajoutez une méthode new (affiche le formulaire) et store (recevra l'envoi) à ShowcaseController :
@staticmethod
def new(request: Request) -> Response:
return BaseController.render("showcase/form.html", request=request,
context={"values": {}})
@staticmethod
def store(request: Request) -> Response:
nom = request.form("nom", default="").strip()
email = request.form("email", default="").strip()
_CONTACTS.append({"nom": nom, "email": email, "academie": "Paris", "statut": "actif"})
return BaseController.redirect("/showcase", request=request, flash="Contact ajouté.")
Déclarez les routes :
public.add("GET", "/showcase/new", ShowcaseController.new, name="showcase-new")
public.add("POST", "/showcase/store", ShowcaseController.store, name="showcase-store")
La vue du formulaire¶
Créez mvc/views/showcase/form.html :
{% extends "layouts/base.html" %}
{% from "components/ui.html" import page_header %}
{% from "components/forms.html" import field, select_field, radio_group, checkbox, fieldset, submit %}
{% block title %}Nouveau contact · {{ app_name }}{% endblock %}
{% block content %}
{{ page_header("Nouveau contact") }}
<form method="post" action="/showcase/store">
{% include "partials/csrf.html" %}
{% call fieldset("Identité") %}
{{ field("nom", label="Nom", value=values.get("nom", ""), required=True) }}
{{ field("email", label="Courriel", type="email", value=values.get("email", ""), required=True) }}
{% endcall %}
{{ select_field("academie", label="Académie",
options=[("paris", "Paris"), ("lyon", "Lyon"), ("lille", "Lille")]) }}
{{ radio_group("statut", label="Statut",
options=[("actif", "Actif"), ("archive", "Archivé")], selected="actif") }}
{{ checkbox("newsletter", "Recevoir les actualités", checked=True) }}
{{ submit("Enregistrer le contact") }}
</form>
{% endblock %}
Le contrôleur passe values (vide ici) ; les champs réaffichent ces valeurs, ce qui servira à la validation au palier suivant.
Le jeton CSRF est injecté automatiquement dans le contexte par render ; partials/csrf.html le pose.
Le catalogue des champs¶
| Macro | Usage |
|---|---|
field(name, label, type, value, required, help) |
texte, courriel, nombre... (via type) |
textarea_field(name, label, rows) |
texte multi-lignes |
select_field(name, label, options, selected) |
liste déroulante |
radio_group(name, label, options, selected) |
choix exclusif |
checkbox(name, label, checked) |
case à cocher |
file_field(name, label, accept) |
envoi de fichier |
search_field(name, placeholder) |
champ de recherche |
fieldset(legend) |
regroupe des champs ({% call %}) |
submit(label) |
bouton d'envoi |
À retenir
- Une page = une route + une méthode de contrôleur + une vue.
- Les macros produisent les champs ; vous écrivez
<form>et incluez le CSRF. - Le contrôleur passe
values; les champs les réaffichent.
Au palier suivant, nous validons l'envoi et affichons les erreurs.