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
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'
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)
...
Django fournit un moyen de stocker des informations supplémentaires sur les utilisateurs dans un tableau séparé (appelé profil utilisateur).
Django actuel est 1.9 et voici quelques mises à jour de la réponse acceptée périmée
models.OneToOneField(User)
related_name='profile'
.__str__()
et .format()
pour Python 3ainsi
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.
À 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 .
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
.
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.