web-dev-qa-db-fra.com

Profil utilisateur Django

Lorsque j'ajoute des champs supplémentaires à un profil d'utilisateur, tels que l'emplacement, le sexe, l'employeur, etc., dois-je ajouter des colonnes supplémentaires à Django.contrib.auth.models.User et les enregistrer? Ou devrais-je créer une nouvelle table pour enregistrer les informations de profil d'utilisateur?

De plus, lorsqu'un utilisateur télécharge une photo de profil, devrais-je l'enregistrer dans le même tableau? (Notez que ce n'est pas un serveur de production, je le fais simplement sur mon serveur d'exécution local pour comprendre). Je vous remercie

37
David542

Vous devez créer un modèle pour le profil utilisateur:

class UserProfile(models.Model):  
    user = models.ForeignKey(User, unique=True)
    location = models.CharField(max_length=140)  
    gender = models.CharField(max_length=140)  
    employer = models.ForeignKey(Employer)
    profile_picture = models.ImageField(upload_to='thumbpath', blank=True)

    def __unicode__(self):
        return u'Profile of user: %s' % self.user.username

Puis configurez dans settings.py:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'
44
Ezequiel Marquez

Conceptuellement, OneToOneField est similaire à une ForeignKey avec unique = True, mais le côté «inverse» de la relation renvoie directement un seul objet. C'est la méthode recommandée pour étendre la classe d'utilisateurs.

class UserProfile(models.Model):  
    user = models.OneToOneField(User)
    ...
29
Dmitry
14
vicvicvic

Django actuel est 1.9 et voici quelques mises à jour de la réponse acceptée périmée

  1. utiliser models.OneToOneField(User)
  2. ajouter related_name='profile'
  3. utilisez .__str__() et .format() pour Python 3

ainsi

class UserProfile(models.Model):  
    user = models.OneToOneField(User, related_name='profile')
    location = models.CharField(max_length=140)  
    gender = models.CharField(max_length=140)  
    ...

    def __str__(self):
        return 'Profile of user: {}'.format(self.user.username)

À l'aide de related_name, vous pouvez accéder facilement au profil d'un utilisateur, par exemple pour request.user.

request.user.profile.location
request.user.profile.gender

Pas besoin de recherches supplémentaires.

14
C14L

À partir de Django 1.5, vous pouvez remplacer l'utilisateur par défaut par votre objet utilisateur personnalisé à l'aide d'une simple entrée de paramètres:

AUTH_USER_MODEL = 'myapp.MyUser'

Pour un peu plus de détails, consultez cette entrée de la documentation Django .

9
Nicu Surdu

Il y a une solution que j'ai trouvée ici . Fondamentalement, vous prolongez le formulaire par défaut UserCreationForm en conservant le même nom. Cela fonctionne parfaitement avec la façon dont les documents de Django vous disent de faire UserProfiles.

4
hitokiri82

La réponse peut être mise à jour pour ajouter un récepteur de signal qui créera le profil s'il n'existe pas et se mettra à jour s'il y est déjà.

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()

This https://simpleisbetterthancomplex.com/tutorial/2016/11/23/how-to-add-user-profile-to-Django-admin.html post explique également comment modifier et répertorier le profil personnalisé. panneau d'administration.

0
Sachin G.