Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django : Etendre un formulaire à partir de django.contrib.auth.models, quelle méthode suivre pour django 1.8?

+4 votes

J'apprends Django depuis un bon mois et depuis quelques jours, je monte un site-web bidon pour m'entrainer à utiliser correctement Django.
Je suis tombé sur un problème de création de membre, pour lequel je ne trouve pas de documentation assez claire ou assez accessible pour mon niveau.

C'est un problème tout simple, je ne sais pas étendre un formulaire à partir du formulaire User de django.contrib.auth.models.

Je n'ai pu comprendre que deux choses :

1) avant on héritait le formulaire du formulaire User de django.contrib.auth.models comme ceci :

from django.contrib.auth.models import User

class Profil(models.Model):
    user = models.OneToOneField(User) 

2) Si j'ai bien compris djangoproject, il faut désormais que la classe hérite directement de AbstractBaseUser et on a donc un code comme ceci :

from django.contrib.auth.models import AbstractBaseUser

class Profile(AbstractBaseUser):
      email = models.EmailField('email address', unique=True)
      first_name = models.CharField(('first name'), max_length=30, blank=True)
      last_name = models.CharField(('last name'), max_length=30, blank=True)
      #définition de champs supplémentaire pour le formulaire

Je voulais simplement demander si la deuxième façon de faire était bonne, elle semble fonctionner quand je lance le site-web mais j'ai également cru comprendre qu'il fallait paramètrer un signal pour sauvegarder le formulaire User, est-ce que signal doit toujours être paramètrer pour Django 1.8?

En bref, est-ce qu'avec Django 1.8, la deuxième façon de faire est claire, nette et efficace ou bien est-ce que je passe à coté de choses importantes.

demandé 22-Jun-2015 par timber (158 points)

Je pense que ma reponse a cette question repondra a ta question.

Oui je suis tombé dessus peu après avoir posé ma question.

Mais donc si je comprends bien, tout est automatique, on ne doit plus configurer de signal ni quoi que ce soit d'autre?
Et pour que les champs de mon formulaire et du formulaire User correspondent, je dois mettre le même nom. Par exemple si je veux un champ pour l'adresse email, je dois marquer exactement email et pas "mail" ou "mail address", etc? C'est la seule condition pour utiliser des champs de User?

Edit : cela ne semble pas fonctionner, je n'avais pas ajouté le champ password et quand je l'ai fait, j'ai eu une erreur expliquant que ce champ était déjà utilisé dans le formulaire User alors je me suis dit que je devais retirer le champ username et tout ceux qui appartienne au formulaire User mais ça ne fonctionne pas. Quand je lance le site, j'ai ceci comme erreur : Unknown field(s) (username) specified for UserProfile

@timber je pense que tu devrais editer ta question et y ajouter precisement le formulaire que tu utilises et qui pose probleme, comme ça on y verra tous plus clair sur là où ça coince.

1 Réponse

+4 votes

avant on héritait le formulaire du formulaire User de
django.contrib.auth.models comme ceci :

Mettons nous bien d'accord, la classe User venant du module django.contrib.auth.models n'est pas un formulaire.

Il existe des formulaire prédéfinis, te permettant de creer, de modifier ou bien de logger un User, voir plus ici

Attention, tu as parfaitement le droit de creer tes propres formulaires, et ne pas utiliser ceux de django.

Mais donc si je comprends bien, tout est automatique, on ne doit plus
configurer de signal ni quoi que ce soit d'autre?

Heu, automatique? Non. Configurer un signal ou quoi que ce soit d'autre? Oui, il faut. Tu as deux options:

  • La premiere, creer un formulaire custom qui herite du formulaire UserCreationForm et y ajouter les champs qui se trouve dans ta classe Profile. Ensuite, surcharger la methode save de ton formulaire custom afin de veiller a peupler les attributs de ta classe Profile.

  • La seconde, te servir de signaux, comme tu l'as suggéré, il exite des tonnes d'exemples sur la toile tel que

répondu 22-Jun-2015 par Nsukami_ (1,998 points)

Finalement j'ai trouvé un tutoriel qui fonctionne bien, il ne s'étend pas sur le sujet des différentes façons de créer un formulaire customisable mais il présente une façon qui fonctionne pour moi.
En fait cela repose sur la première façon que j'avais présentée ici :

from django.contrib.auth.models import User

class Profil(models.Model):
    user = models.OneToOneField(User) 

De plus, c'est également la méthode préconisée sur openclassrooms

Mais le tutoriel que je suis maintenant est encore plus verbeux ce qui est très bien pour les gens qui débutent : http://www.tangowithdjango.com/book17/index.html

J'ai abandonné la méthode reposant sur l'héritage du modèle AbstractBaseUser car d'après ce que je peux lire, il faut tout reconfigurer après, par exemple en précisant une nouvelle méthode d'instanciation basée sur BaseUserManager.

J'avais essayé de suivre ce tutoriel : https://www.sofokus.com/en/custom-user-model/

Pour conclure, si j'ai une façon de faire qui marche je suis content. Quand j'aurais fait le tour des fonctionnalités de base d'un site web dynamique, j'en referai un deuxième pour améliorer ce que je peux améliorer.

...