Comment créer des sous-formulaires à partir d’un Model Django
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 :
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) :
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 :
# 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 submit en utilisant la commande :
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 :
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