¿Cómo acceder al perfil de usuario en una plantilla de Django?


88

Estoy almacenando información adicional por usuario usando el AUTH_PROFILE_MODULE.

Podemos acceder al usuario en una plantilla de Django usando, {{ request.user }}pero ¿cómo accedemos a los campos en el perfil ya que el perfil solo es accesible a través de una función user.get_profile()?

¿Es realmente necesario pasar explícitamente el perfil a la plantilla cada vez?

Respuestas:


136

Utilice {{ request.user.get_profile.whatever }}. El lenguaje de plantillas de Django llama automáticamente a las cosas que se pueden llamar, en este caso, el .get_profile()método.



3
Esto está obsoleto en Django 1.5 y posteriores y no funciona en Django 1.7 y posteriores. Vea la respuesta de Sacha Rau sobre cómo hacer esto en el Django moderno.
MichielB

27

No estoy seguro de por qué es diferente para mí, pero necesito usar {{user}} en lugar de {{request.user}}.


5
Los documentos dicen ( docs.djangoproject.com/en/dev/topics/auth/… ) que puede acceder al usuario simplemente con {{user}}, como usted dice.
Xiong Chiamiov

2
La verdadera razón para usar {{user}} y no {{request.user}} es porque no incluye el procesador de contexto de la plantilla para la solicitud. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
El enlace es ligeramente diferente para Django 1.10, pero la idea es la misma, django.template.context_processors.requestinserta la requestplantilla en, mientras que la django.contrib.auth.context_processors.authinserta useren contexto. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

Sí, es posible acceder al perfil desde la plantilla usando request.user.get_profile

Sin embargo, hay una pequeña advertencia : no todos los usuarios tendrán perfiles, que fue en mi caso con los usuarios administradores. Por tanto, llamar directamente {{ request.user.get_profile.whatever }}desde la plantilla provocará un error en tales casos.

Si está seguro de que todos sus usuarios siempre tienen perfiles, es seguro llamar desde la plantilla; de lo contrario, llame get_profile()desde dentro del bloque try-except en su vista y páselo a la plantilla.


Esta respuesta es engañosa: no la he probado {{ request.user.get_profile.whatever }}, pero {{ request.user.get_profile }}funcionará y se puede usar para verificar si existe un perfil o no en las versiones actuales. Consulte docs.djangoproject.com/en/dev/ref/templates/api/… . Sin embargo, hay una nota que cambiará en la versión de desarrollo, vea el párrafo anterior al que me vinculé.
ralokt

@tkolar, ¿qué es exactamente engañoso aquí? si el usuario no tiene un perfil y está llamando a get_profile.something que causará un error.
Sergey Golovchenko

4

Si está usando Django> 1.5 ya no puede usar get_profile.

Si tiene una aplicación heredada, debe eliminarla AUTH_PROFILE_MODULE = 'myapp.profile'de su settings.py.

Si usa models.OneToOneField(User)en su clase de perfil, simplemente puede usar

{{ request.user.profile.whatever }}

en tu plantilla de Django


1
@AlexStewart, ¿quieres decir que ya no necesitamos el requestteclado en el frente?
Luk Aron

3

Si ayuda a alguien, utilicé lo siguiente en mi plantilla:

Nombre de usuario: {{ user.username }}

Usuario Nombre completo: {{ user.get_full_name }}

Grupo de usuario: {{ user.groups.all.0 }}

Correo electrónico: {{ user.email }}

La sesión comenzó en: {{ user.last_login }}

Un resultado de muestra es así:

Usuario: auditor ezio

Grupo de usuarios: auditGroup

Nombre de usuario: testUser03

Correo electrónico: testuser03@auditor.com

La sesión comenzó el 16 de abril de 2018 a las 9:38 p.m.

Gracias :)


1

Trabajando !

En su modelo de perfil, proporcione related_name

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

Luego en uso de plantilla. Aquí company_name es un campo en la tabla de perfil

{{ request.user.user_profile.company_name }}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.