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

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :