Як отримати доступ до профілю користувача у шаблоні Django?


88

Я зберігаю додаткову інформацію про кожного користувача за допомогою AUTH_PROFILE_MODULE.

Ми можемо отримати доступ до користувача в шаблоні Django за допомогою, {{ request.user }}але як отримати доступ до полів у профілі, оскільки профіль доступний лише через функцію user.get_profile()?

Чи справді потрібно щоразу явно передавати профіль у шаблон?

Відповіді:


136

Використовуйте {{ request.user.get_profile.whatever }}. Мова шаблонів Django автоматично викликає речі, які можна викликати - у цьому випадку .get_profile()метод.


3
Див. Docs.djangoproject.com/en/dev/topics/templates/#variables Правила дуже класні.
S.Lott

3
Це застаріло в Django 1.5 та новіших версіях, і не працює в Django 1.7 та новіших версіях. Дивіться відповідь Саша Рау, як це зробити в сучасному Джанго.
MichielB

27

Не знаю, чому для мене це інакше, але мені потрібно використовувати {{user}}, а не {{request.user}}.


5
У документах сказано ( docs.djangoproject.com/en/dev/topics/auth/… ), що ви можете отримати доступ до користувача просто {{користувач}}, як ви сказали.
Xiong Chiamiov 02

2
Справжньою причиною використання {{user}}, а не {{request.user}} є те, що ви не включаєте процесор контексту шаблону для запиту. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo 02.03.14

4
Посилання дещо відрізняється для Django 1.10, але ідея однакова, django.template.context_processors.requestвставляє requestшаблон в шаблон, а django.contrib.auth.context_processors.authвставляє userв контекст. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

Так, можна отримати доступ до профілю з шаблону за допомогою request.user.get_profile

Однак є невелика застереження : не всі користувачі матимуть профілі, як це було в моєму випадку з адміністраторами. Тож виклик безпосередньо {{ request.user.get_profile.whatever }}з шаблону в таких випадках призведе до помилки.

Якщо ви впевнені, що у всіх ваших користувачів завжди є профілі, можна безпечно дзвонити із шаблону, інакше дзвоніть get_profile()із блоку try-Osim у своєму поданні та передайте його шаблону.


Ця відповідь вводить в оману - я не тестував {{ request.user.get_profile.whatever }}, але {{ request.user.get_profile }}працюватиму і можу використовуватись, щоб перевірити, чи існує профіль чи ні в поточних версіях. Див. Docs.djangoproject.com/en/dev/ref/templates/api/… . Існує примітка, що це зміниться у версії для розробки, однак, див. Абзац над тим, до якого я зв’язав.
ralokt

@tkolar, що саме тут вводить в оману? якщо користувач не має профілю, і ви викликаєте get_profile.something, що призведе до помилки.
Сергій Головченко

4

Якщо ви використовуєте Django> 1,5, ви більше не можете використовувати get_profile .

Якщо у вас є застарілий додаток, вам слід видалити AUTH_PROFILE_MODULE = 'myapp.profile'з вашогоsettings.py .

Якщо ви використовуєте models.OneToOneField(User)у своєму класі профілю, ви можете просто використовувати

{{ request.user.profile.whatever }}

у вашому шаблоні Django


1
@AlexStewart ти маєш на увазі, що нам більше не потрібна requestклавіатура спереду?
Лук Арон,

3

Якщо це комусь допомагає, я використав у своєму шаблоні наступне:

Ім'я користувача: {{ user.username }}

Повне ім’я користувача: {{ user.get_full_name }}

Група користувачів: {{ user.groups.all.0 }}

Електронна адреса: {{ user.email }}

Сесія розпочалася о: {{ user.last_login }}

Приклад результату такий:

Користувач: аудитор ezio

Група користувачів: auditGroup

Ім'я користувача: testUser03

Електронна адреса: testuser03@auditor.com

Сесія розпочалась 16 квітня 2018 року, 21:38

Дякую :)


1

Працює!

У вашій моделі профілю вкажіть related_name

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

Потім у використанні шаблону. Тут назва компанії - це поле в таблиці профілів

{{ request.user.user_profile.company_name }}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.