Comment accéder au profil utilisateur dans un template Django?

88

Je stocke des informations supplémentaires par utilisateur en utilisant le AUTH_PROFILE_MODULE.

On peut accéder à l'utilisateur dans un template 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 transmettre explicitement le profil dans le modèle à chaque fois?

Swaroop CH
la source

Réponses:

136

Utilisez {{ request.user.get_profile.whatever }}. Le langage de création de modèles de Django appelle automatiquement les éléments appelables - dans ce cas, la .get_profile()méthode.

AdamKG
la source
3
Voir docs.djangoproject.com/en/dev/topics/templates/#variables Les règles sont très cool.
S.Lott
3
Ceci est obsolète dans Django 1.5 et plus et ne fonctionne pas dans Django 1.7 et plus. Voir la réponse de Sacha Rau pour savoir comment faire cela dans Django moderne.
MichielB
27

Je ne sais pas pourquoi c'est différent pour moi, mais je dois utiliser {{user}} plutôt que {{request.user}}.

Rachel
la source
5
La documentation dit ( docs.djangoproject.com/en/dev/topics/auth/… ) que vous pouvez accéder à l'utilisateur simplement par {{user}}, comme vous le dites.
Xiong Chiamiov
2
La vraie raison d'utiliser {{user}} et non {{request.user}} est que vous n'incluez pas le processeur de contexte de modèle pour la requête. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo
4
Le lien est légèrement différent pour Django 1.10, mais l'idée est la même, l' django.template.context_processors.requestinsère requestdans le modèle, tandis que l' django.contrib.auth.context_processors.authinsère userdans le contexte. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre
8

Oui, il est possible d'accéder au profil à partir du modèle en utilisant request.user.get_profile

Cependant, il y a une petite mise en garde : tous les utilisateurs n'auront pas de profils, ce qui était dans mon cas avec les utilisateurs administrateurs. Donc, appeler directement à {{ request.user.get_profile.whatever }}partir 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é à partir du modèle, sinon appelez à get_profile()partir du bloc try-except dans votre vue et passez-le au modèle.

Sergey Golovchenko
la source
Cette réponse est trompeuse - je n'ai pas testé {{ request.user.get_profile.whatever }}, mais {{ request.user.get_profile }}fonctionnera et pourra être utilisée pour vérifier si un profil existe ou non dans les versions actuelles. Voir docs.djangoproject.com/en/dev/ref/templates/api/… . Il y a une note que cela changera dans la version de développement, cependant, voir le paragraphe au-dessus de celui auquel j'ai lié.
ralokt
@tkolar, qu'est-ce qui est trompeur ici? si l'utilisateur n'a pas de profil et que vous appelez get_profile.something qui provoquera une erreur.
Sergey Golovchenko
4

Si vous utilisez Django> 1.5, vous ne pouvez plus utiliser get_profile.

Si vous possédez une ancienne application, vous devez la supprimer AUTH_PROFILE_MODULE = 'myapp.profile'de votre settings.py.

Si vous utilisez models.OneToOneField(User)dans votre classe Profile, vous pouvez simplement utiliser

{{ request.user.profile.whatever }}

dans votre template Django

Sascha Rau
la source
1
@AlexStewart vous voulez dire que nous n'avons plus besoin du requestclavier à l'avant?
Luk Aron
3

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 }}

Email: {{ user.email }}

Session commencée à: {{ user.last_login }}

Un exemple de résultat est comme ceci:

Utilisateur: auditor ezio

Groupe d'utilisateurs: auditGroup

Nom d'utilisateur: testUser03

Courriel: [email protected]

Session commencée le 16 avril 2018, 21h38

Merci :)

Mohammad
la source
1

Travail !

Dans votre modèle de profil, indiquez related_name

user = models.OneToOneField(AUTH_USER_MODEL, related_name="user_profile", on_delete=models.CASCADE)

Puis dans l'utilisation du modèle. Ici, nom_entreprise est un champ dans la table de profil

{{ request.user.user_profile.company_name }}
Nids Barthwal
la source