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?

Swaroop CH
fonte

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.

AdamKG
fonte
3
Veja docs.djangoproject.com/en/dev/topics/templates/#variables As regras são muito legais.
S.Lott
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}}.

Rachel
fonte
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.

Sergey Golovchenko
fonte
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

Sascha Rau
fonte
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: [email protected]

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

Obrigado :)

Maomé
fonte
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 }}
Nids Barthwal
fonte