Как получить доступ к профилю пользователя в шаблоне Django?

89

Я храню дополнительную информацию для каждого пользователя, используя расширение AUTH_PROFILE_MODULE.

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

Действительно ли обязательно каждый раз явно передавать профиль в шаблон?

Swaroop CH
источник

Ответы:

136

Используйте {{ request.user.get_profile.whatever }}. Язык шаблонов Django автоматически вызывает вызываемые объекты - в данном случае .get_profile()метод.

AdamKG
источник
3
См. Docs.djangoproject.com/en/dev/topics/templates/#variables . Правила очень крутые.
S.Lott
3
Это устарело в Django 1.5 и выше и не работает в Django 1.7 и выше. См. Ответ Саши Рау, чтобы узнать, как это сделать в современном Django.
MichielB
27

Не знаю, почему для меня это другое, но мне нужно использовать {{user}}, а не {{request.user}}.

Рэйчел
источник
5
В документации сказано ( docs.djangoproject.com/en/dev/topics/auth/… ), что вы можете получить доступ к пользователю, просто используя {{user}}, как вы говорите.
Xiong Chiamiov 02
2
Настоящая причина использования {{user}}, а не {{request.user}} заключается в том, что вы не включаете обработчик контекста шаблона для запроса. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo 02
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/…
Андрей-Никулае Петре
8

Да, можно получить доступ к профилю из шаблона с помощью request.user.get_profile

Однако есть небольшая оговорка : не у всех пользователей будут профили, как в моем случае с администраторами. Поэтому вызов напрямую {{ request.user.get_profile.whatever }}из шаблона в таких случаях вызовет ошибку.

Если вы уверены, что у всех ваших пользователей всегда есть профили, вызовите из шаблона безопасно, в противном случае вызовите get_profile()из блока try-except в вашем представлении и передайте его в шаблон.

Сергей Головченко
источник
Этот ответ вводит в заблуждение - я не тестировал {{ 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)в своем классе Profile, вы можете просто использовать

{{ request.user.profile.whatever }}

в вашем шаблоне Django

Саша Рау
источник
1
@AlexStewart, ты хочешь сказать, что нам больше не нужна requestклавиатура спереди?
Luk Aron
3

Если это кому-то поможет, я использовал в своем шаблоне следующее:

Имя пользователя: {{ user.username }}

Полное имя пользователя: {{ user.get_full_name }}

Группа пользователей: {{ user.groups.all.0 }}

Электронное письмо: {{ user.email }}

Сессия началась: {{ user.last_login }}

Примерный результат такой:

Пользователь: auditor 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 }}
Нидс Бартвал
источник