Comment créer des sous-formulaires à partir d'un Model Django

Sep 9, 2010

Avatar of Olivier Girardot
Olivier Girardot

Un petit article Python de temps en temps ne fait pas de mal, donc ici je vais détailler la manière très simple d'utiliser les modèles Django pour créer des formulaires, mais aussi créer des sous-types de formulaire à partir du même modèle. Tout va s'expliquer :

Quand on créé un objet avec la couche de persistance de Django, on crée une nouvelle classe :

text
class User(models.Model):
    username = models.CharField(max_length=255)
    password = models.CharField(max_length=255)
    email = models.EmailField(max_length=255)
    blog = models.URLField(verify_exists=False)
    created_at = models.DateTimeField(auto_now=True, auto_now_add=True)

    def __unicode__(self):
        return self.username

Cette classe permet de gérer automatiquement les données base de données, la DAO, et quelques validations. Maintenant il n'est pas rare de vouloir lier un formulaire à un tel objet, pour gérer de simple CRUD. Rien n'est plus simple avec Django où il suffit d'écrire le code suivant (toujours dans models.py) :

text
class UserForm(forms.ModelForm):
    class Meta:
        model = User

Ce code complexe permet non-seulement de gérer les champs associés à l'objet User, mais il possède aussi une interaction facilitée avec tous les objets persistants, voilà quelques exemples d'utilisations :

text
    # loading object
    aUser = User.objects.get(id=id);
    # using it to create a bounded form to this object
    aUserForm = UserForm(instance=aUser)

On peut aussi récupérer une instance de formulaire à partir d'un submiten utilisant la commande :

text
    form = UserForm(request.POST)
    if form.is_valid():
         #etc.

Cette validation permet d'obtenir un objet clean avant la sauvegarde. Maintenant même si tout cela est très intéressant, ces informations sont présentes de bases dans la documentation officielle de Django, et je vais plutôt approfondir un point. Comment créer un formulaire à partir d'un modèle qui n'affiche pas tous les champs du modèle ?

Le système est prévu aussi pour ça, il permet de créer des sous-formulaires en sélectionnant les champs à afficher, on peut donc créer deux formulaires différents, une simple et une avancée :

text
class SimpleUserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('username', 'email', 'blog')

class AdvancedUserForm(forms.ModelForm):
    class Meta:
        model = User
        fields =  ('username', 'password', 'email', 'blog')

Ces formulaires partiels peuvent ainsi servir à afficher l'objet ou permettre l'édition mais que sur certains champs.

Vale

Menu

Follow

Copyright © 2026
 Olivier Girardot's Ramblings
  Powered by   Writizzy