• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 12/12/19

Améliorez la gestion du formulaire

Log in or subscribe for free to enjoy all this course has to offer!

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.

Example of certificate of achievement
Example of certificate of achievement