--- title: Formulaires Django author: Steve Kossouho --- # Saisir des données avec les formulaires ---- ## Les formulaires HTML Le web n'a pas toujours eu de formulaires, mais c'est arrivé très tôt; Le navigateur [Mosaic du NCSA](https://en.wikipedia.org/wiki/NCSA_Mosaic) a introduit le concept dans sa version 2.0, publiée en novembre 1993. Ils sont rentrés de facto dans la spécification HTML, qui a subi quelques améliorations depuis. En HTML, les formulaires permettent à l'utilisateur d'interagir et d'envoyer des données. Django fournit une classe `Form`{.python} qui permet de facilement construire des formulaires et d'abstraire leur validation du contenu. ---- ## Les formulaires avec Django Pour pouvoir afficher des formulaires dans un site Django, il faut écrire des classes Python qui héritent d'une classe `Form`{.python} se trouvant dans le module `django.forms`{.python}. Les classes de formulaire décrivent les champs du formulaire à afficher, ainsi que leur type (texte, fichier, date, etc.) et leur contenu. ```python {.numberLines} from datetime import date from django import forms class PersonForm(forms.Form): """Exemple de formulaire avec des champs de types divers.""" first_name = forms.CharField(max_length=32, label="first name") last_name = forms.CharField(max_length=32, label="last name") birth_date = forms.DateField(initial=date(1990, 1, 1), label="birthday") number = forms.IntegerField(label="phone number") password = forms.CharField(widget=forms.PasswordInput, max_length=50, label="password") ``` Les classes de formulaire déclarent des attributs dont les types sont des instances de classes héritant de `Field`{.python}. [Documentation des champs de formulaires](https://docs.djangoproject.com/en/dev/ref/forms/fields/) ---- ## Utilisation de formulaires Une fois un formulaire défini, on peut l'utiliser dans une vue. ```python {.numberLines} from django.shortcuts import render from demonstration.forms import PersonForm def view_person_form(request): """Utilisation du formulaire PersonForm.""" form = PersonForm(data=request.POST or None) return render(request, "person-form.html", {"form": form}) ``` Lorsqu'une vue affiche un formulaire, elle doit l'initialiser. Un objet de formulaire peut être initialisé de deux manieres : - `PersonForm(data=request.POST)`{.python} si la requête HTTP est de type `POST`; - `PersonForm()`{.python} si la requête HTTP est de type `GET`. Dans le premier cas, les données ``POST: dict``{.python} seront utilisées pour les associer à l'objet formulaire. Dans le second cas, le formulaire sera vide et s'affichera sans contenu dans le template. ---- ## Utilisation des formulaires dans les templates Lorsque l'on a instancié un objet `Form`{.python}, nous l'envoyons au contexte du template. Interpoler l'objet suffit à en afficher les champs. Les données liées à l'objet seront visibles dans les champs. ```djangotemplate {.numberLines} ...