Je stocke des informations supplémentaires par utilisateur à l'aide de AUTH_PROFILE_MODULE
.
Nous pouvons accéder à l'utilisateur dans un modèle Django en utilisant {{ request.user }}
, mais comment accéder aux champs du profil puisque le profil n'est accessible que via une fonction user.get_profile()
?
Est-il vraiment nécessaire de passer explicitement le profil dans le modèle à chaque fois?
Utilisez {{ request.user.get_profile.whatever }}
. Le langage de modélisation de Django appelle automatiquement les éléments appelables - dans ce cas, la méthode .get_profile()
.
Je ne sais pas pourquoi c'est différent pour moi, mais je dois utiliser {{utilisateur}} plutôt que {{request.user}}.
Oui, il est possible d'accéder au profil à partir d'un modèle à l'aide de request.user.get_profile
Cependant, il y a un petit caveat: tous les utilisateurs n'auront pas de profils, ce qui était dans mon cas avec les utilisateurs admin. Alors appelant directement {{ request.user.get_profile.whatever }}
du modèle provoquera une erreur dans de tels cas.
Si vous êtes sûr que tous vos utilisateurs ont toujours des profils, vous pouvez appeler en toute sécurité depuis un modèle. Dans le cas contraire, appelez get_profile()
à partir du bloc try-except de votre vue et transmettez-le au modèle.
Si vous utilisez Django> 1.5, vous ne pouvez plus utiliser get_profile
.
Si vous avez une application héritée, vous devez supprimer AUTH_PROFILE_MODULE = 'myapp.profile'
de votre settings.py
.
Si vous utilisez models.OneToOneField(User)
dans votre classe de profil, vous pouvez simplement utiliser
{{ request.user.profile.whatever }}
dans votre template Django
Si cela aide quelqu'un, j'ai utilisé les éléments suivants dans mon modèle:
Nom d'utilisateur: {{ user.username }}
Nom complet de l'utilisateur: {{ user.get_full_name }}
Groupe d'utilisateurs: {{ user.groups.all.0 }}
Courriel: {{ user.email }}
Session démarrée à: {{ user.last_login }}
Un exemple de résultat est comme ceci:
Utilisateur: auditor ezio
Groupe d'utilisateurs: auditGroup
Nom d'utilisateur: testUser03
Email: [email protected]
Séance commencée le 16 avril 2018 à 21 h 38.
Merci :)
Travail !
Dans votre modèle de profil, indiquez related_name
user = models.OneToOneField(AUTH_USER_MODEL, related_name="user_profile", on_delete=models.CASCADE)
Ensuite, dans l'utilisation du modèle. Ici nom_entreprise est le champ dans la table de profil
{{ request.user.user_profile.company_name }}