Como acessar o perfil do usuário em um template Django?


88

Estou armazenando algumas informações adicionais por usuário usando o AUTH_PROFILE_MODULE.

Podemos acessar o usuário em um modelo Django usando, {{ request.user }}mas como acessamos os campos no perfil, uma vez que o perfil só é acessível por meio de uma função user.get_profile()?

É realmente necessário passar explicitamente o perfil para o modelo todas as vezes?

Respostas:


136

Use {{ request.user.get_profile.whatever }}. A linguagem de modelagem do Django chama automaticamente coisas que podem ser chamadas - neste caso, o .get_profile()método.



3
Isso está obsoleto no Django 1.5 e superior e não funciona no Django 1.7 e superior. Veja a resposta de Sacha Rau para saber como fazer isso no Django moderno.
MichielB

27

Não sei por que é diferente para mim, mas preciso usar {{user}} em vez de {{request.user}}.


5
Os documentos dizem ( docs.djangoproject.com/en/dev/topics/auth/… ) que você pode acessar o usuário simplesmente por {{user}}, como você diz.
Xiong Chiamiov

2
A verdadeira razão para usar {{user}} e não {{request.user}} é porque você não inclui o processador de contexto do modelo para a solicitação. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
O link é um pouco diferente para o Django 1.10, mas a ideia é a mesma, o django.template.context_processors.requestinsere requestno template, enquanto o django.contrib.auth.context_processors.authinsere userno contexto. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

Sim, é possível acessar o perfil do template usando request.user.get_profile

No entanto, há uma pequena advertência : nem todos os usuários terão perfis, o que foi no meu caso com usuários administradores. Portanto, chamar diretamente {{ request.user.get_profile.whatever }}do modelo causará um erro nesses casos.

Se você tiver certeza de que todos os seus usuários sempre têm perfis, é seguro chamar a partir do modelo, caso contrário, ligue get_profile()de dentro do bloco try-except em sua visualização e passe para o modelo.


Esta resposta é enganosa - eu não testei {{ request.user.get_profile.whatever }}, mas {{ request.user.get_profile }}funcionará e pode ser usado para verificar se um perfil existe ou não nas versões atuais. Consulte docs.djangoproject.com/en/dev/ref/templates/api/… . Há uma observação de que isso mudará na versão de desenvolvimento, porém, veja o parágrafo acima daquele ao qual vinculei.
ralokt de

@tkolar, o que exatamente é enganoso aqui? se o usuário não tiver um perfil e você estiver chamando get_profile.salgo que causará um erro.
Sergey Golovchenko

4

Se você estiver usando Django> 1.5, você não pode mais usar get_profile.

Se você tiver um aplicativo legado, deverá removê-lo AUTH_PROFILE_MODULE = 'myapp.profile'do seu settings.py.

Se você usar models.OneToOneField(User)em sua classe de perfil, você pode simplesmente usar

{{ request.user.profile.whatever }}

no seu modelo Django


1
@AlexStewart, você quer dizer que não precisamos mais do requestteclado na frente?
Luk Aron

3

Se isso ajudar alguém, usei o seguinte em meu modelo:

Nome do usuário: {{ user.username }}

Nome completo do usuário: {{ user.get_full_name }}

Grupo de usuários: {{ user.groups.all.0 }}

O email: {{ user.email }}

Sessão iniciada em: {{ user.last_login }}

Um resultado de amostra é assim:

Usuário: auditor ezio

Grupo de usuários: auditGroup

Nome de usuário: testUser03

Email: testuser03@auditor.com

Sessão iniciada em 16 de abril de 2018, 21:38

Obrigado :)


1

Trabalhando !

Em seu modelo de perfil, forneça related_name

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

Em seguida, em uso de modelo. Aqui company_name é o campo na tabela de perfil

{{ request.user.user_profile.company_name }}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.