Django Class Based Views et AbstractUser

CBV avec un model AbstractUser

Une des fonctionnalités de Django que je préfère est les Class Based Views. Ce sont des views (équivalent des contrôleurs dans le MVC), auto générées. 5 d'entre elles permettent de créer très facilement et très rapidement une interface CRUD (Create, Read, Update and Delete). Ce sont les classes :

Pour un projet, j'ai eu besoin de permettre la création d'utilisateurs via un CBV. J'ai cependant rencontré un problème important : la CBV CreateView enregistrait le mot de passe en clair. Donc, une fois que l'utilisateur était enregistré, l'authentification échouait car la vérification était faite à partir du mot de passe posté via le formulaire de connexion puis hashé. J'ai donc dû surcharger l'enregistrement du formulaire pour générer le hash du mot de passe en clair.
Voici la CBV qui me permet d'enregistrer un utilisateur facilement :

class UserCreate(CreateViewCustom):
def form_valid(self, form):
"""
Surcharger pour hasher le mot de passe
"""
self.object = form.save()
self.object.set_password(self.object.password)
return super(UserCreate, self).form_valid(form)
def get_success_url(self):
return reverse('login')

Cette CBV hérite d'une CBV dérivée de CreateView, qui contient des méthodes que je trouve très utile et que je partagerai peut être par la suite.
Je trouve cette solution plus élégante que l'utilisation d'un ModelForm, mais il ne faut pas oublier qu'une CBV ne doit pas devenir trop complexe (PEP20 : Simple is better than complex). Si vous avez d'autres éléments à personnaliser, vous feriez peut-être mieux de passer par un ModelForm.