Jak uzyskać dostęp do profilu użytkownika w szablonie Django?

88

Przechowuję dodatkowe informacje o każdym użytkowniku przy użyciu rozszerzenia AUTH_PROFILE_MODULE.

Możemy uzyskać dostęp do użytkownika w szablonie Django za pomocą, {{ request.user }}ale jak możemy uzyskać dostęp do pól w profilu, skoro profil jest dostępny tylko za pośrednictwem funkcji user.get_profile()?

Czy naprawdę konieczne jest jawne przekazywanie profilu do szablonu za każdym razem?

Swaroop CH
źródło

Odpowiedzi:

136

Użyj {{ request.user.get_profile.whatever }}. Język szablonów Django automatycznie wywołuje rzeczy, które można wywołać - w tym przypadku .get_profile()metodę.

AdamKG
źródło
3
Zobacz docs.djangoproject.com/en/dev/topics/templates/#variables Zasady są bardzo fajne.
S.Lott,
3
Jest to przestarzałe w Django 1.5 i nowszych i nie działa w Django 1.7 i nowszych. Zobacz odpowiedź Sacha Rau, jak to zrobić we współczesnym Django.
MichielB
27

Nie wiem, dlaczego jest inaczej, ale muszę użyć {{user}} zamiast {{request.user}}.

Rachel
źródło
5
Dokumenty mówią ( docs.djangoproject.com/en/dev/topics/auth/… ), że możesz uzyskać dostęp do użytkownika po prostu przez {{user}}, jak mówisz.
Xiong Chiamiov
2
Prawdziwym powodem używania {{user}} a nie {{request.user}} jest to, że nie dołączasz do żądania procesora kontekstu szablonu. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo
4
Link jest nieco inny dla Django 1.10, ale pomysł jest ten sam, django.template.context_processors.requestwstawia requestszablon in, a django.contrib.auth.context_processors.authwstawia userkontekst. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre
8

Tak, możliwy jest dostęp do profilu z szablonu za pomocą request.user.get_profile

Jest jednak małe zastrzeżenie : nie wszyscy użytkownicy będą mieli profile, co w moim przypadku miało miejsce w przypadku administratorów. Więc wywołanie bezpośrednio {{ request.user.get_profile.whatever }}z szablonu spowoduje w takich przypadkach błąd.

Jeśli jesteś pewien, że wszyscy Twoi użytkownicy zawsze mają profile, możesz bezpiecznie wywołać z szablonu, w przeciwnym razie zadzwoń get_profile()z bloku try-except w swoim widoku i przekaż go do szablonu.

Sergey Golovchenko
źródło
Ta odpowiedź jest myląca - nie testowałem {{ request.user.get_profile.whatever }}, ale {{ request.user.get_profile }}zadziała i może posłużyć do sprawdzenia, czy profil istnieje, czy nie w aktualnych wersjach. Zobacz docs.djangoproject.com/en/dev/ref/templates/api/… . Jest uwaga, że ​​zmieni się to w wersji rozwojowej, zobacz akapit nad tym, do którego się podłączyłem.
ralokt
@tkolar, co tu właściwie wprowadza w błąd? jeśli użytkownik nie ma profilu, a dzwonisz do get_profile. coś, co spowoduje błąd.
Sergey Golovchenko
4

Jeśli używasz Django> 1.5, nie możesz już używać get_profile.

Jeśli masz starszą aplikację, usuń ją AUTH_PROFILE_MODULE = 'myapp.profile'zsettings.py .

Jeśli używasz models.OneToOneField(User)w swojej klasie profilu, możesz po prostu użyć

{{ request.user.profile.whatever }}

w szablonie Django

Sascha Rau
źródło
1
@AlexStewart masz na myśli, że nie potrzebujemy już request klawiatury z przodu?
Luk Aron
3

Jeśli komuś to pomoże, użyłem w moim szablonie:

Nazwa Użytkownika: {{ user.username }}

Imię i nazwisko użytkownika: {{ user.get_full_name }}

Grupa użytkowników: {{ user.groups.all.0 }}

E-mail: {{ user.email }}

Sesja rozpoczęła się o: {{ user.last_login }}

Przykładowy wynik wygląda tak:

Użytkownik: audytor ezio

Grupa użytkowników: auditGroup

Nazwa użytkownika: testUser03

E-mail: [email protected]

Sesja rozpoczęła się 16 kwietnia 2018 o godzinie 21:38

Dzięki :)

Mohammad
źródło
1

Działa!

W swoim modelu profilu podaj related_name

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

Następnie użyj szablonu. Tutaj nazwa_firmy to pole w tabeli profilu

{{ request.user.user_profile.company_name }}
Nids Barthwal
źródło