• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 12/12/2019

Améliorez la gestion du formulaire

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans le chapitre précédent vous avez ajouté votre premier formulaire en utilisant les outils par défaut de Django. Bravo ! Voyons à présent comment aller plus loin en simplifiant la classe de formulaire et en personnalisant les erreurs.

Utilisation d'une classe de formulaire pensée pour les modèles

Vous avez ajouté un formulaire parfaitement représentatif de la structure de la table associée. En effet, votre formulaire contient exactement les mêmes champs que ceux qui constituent la table Contact : un nom et un email.

Il est alors redondant de spécifier dans le formulaire le type de chaque champ car vous l'avez déjà fait !

Django propose une manière alternative de créer un formulaire : ModelForm. Il se base alors sur le modèle pour savoir ce qui est attendu de chaque champ. Plus besoin de le spécifier !

Ainsi, vous pouvez remplacer l'intégralité du fichier forms.py par le contenu suivant :

forms.py

from django.forms import ModelForm, TextInput, EmailInput
from .models import Contact

class ContactForm(ModelForm):
    class Meta:
        model = Contact
        fields = ["name", "email"]
        widgets = {
            'name': TextInput(attrs={'class': 'form-control'}),
            'email': EmailInput(attrs={'class': 'form-control'})
        }

Personnaliser les erreurs

Actuellement, les erreurs sont générées par Django. Par exemple, le gabarit suivant :

{% if errors %}
<div>
  {% for key, error in errors %}
  {% autoescape off %}
    {{ error }}
  {% endautoescape %}
  {% endfor %}
</div>
{% endif %}

peut générer le code suivant :

<div>
  <ul class="errorlist"><li>Saisissez une adresse de courriel valide.</li></ul>
</div>

Dans bien des cas, vous voudrez changer cela. Mais comment faire puisque les balises ul et li sont ajoutées automatiquement ?

Django étant du pur Python, il est possible d'utiliser l'héritage pour changer le comportement des classes souhaitées. En lisant la documentation relative aux erreurs, vous découvrirez que la classe responsable de cela s'appelle ErrorList et que la méthode utilisée est as_divs().

Si vous souhaitez remplacer la liste à puces par des paragraphes, voici comment faire. Commencez par créer une nouvelle classe enfant dans forms.py :

forms.py

from django.forms.utils import ErrorList
# ...

class ParagraphErrorList(ErrorList):
    def __str__(self):
        return self.as_divs()
    def as_divs(self):
        if not self: return ''
        return '<div class="errorlist">%s</div>' % ''.join(['<p class="small error">%s</p>' % e for e in self])

Puis utilisez-la dans la vue :

views.py

from .forms import ContactForm, ParagraphErrorList

# ...

def detail(request, album_id):
    # ...
    form = ContactForm(request.POST, error_class=ParagraphErrorList)

Et voici le résultat :

Ce chapitre est terminé ! Dans le prochain chapitre vous en saurez plus sur les transactions, cet outil extraordinaire qui évite bien des erreurs ! A tout de suite !

Code de ce chapitre

Retrouvez l'intégralité du code sur ce dépôt GitHub.

Exemple de certificat de réussite
Exemple de certificat de réussite