Django 템플릿에서 사용자 프로필에 액세스하는 방법은 무엇입니까?


88

.NET Framework를 사용하여 추가 사용자 별 정보를 저장하고 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 이상에서는 작동하지 않습니다. 현대 Django에서 이것을 수행하는 방법은 Sacha Rau의 답변을 참조하십시오.
MichielB

27

왜 다른지 잘 모르겠지만 {{request.user}} 대신 {{user}}를 사용해야합니다.


5
문서에는 ( docs.djangoproject.com/en/dev/topics/auth/… ) 말했듯 이 {{user}}만으로 사용자에 액세스 할 수 있다고합니다.
Xiong Chiamiov 2010

2
{{request.user}}가 아닌 {{user}}를 사용하는 실제 이유는 요청에 템플릿 컨텍스트 프로세서를 포함하지 않았기 때문입니다. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
링크는 Django 1.10의 경우 약간 다르지만 아이디어는 동일 django.template.context_processors.request합니다. requestin 템플릿을 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-except 블록 내에서 호출 하여 템플릿에 전달합니다.


이 대답은 오해의 소지가 있습니다. 테스트 {{ request.user.get_profile.whatever }}하지는 않았지만 {{ request.user.get_profile }}작동하며 현재 버전에 프로필이 있는지 여부를 확인하는 데 사용할 수 있습니다. docs.djangoproject.com/en/dev/ref/templates/api/…를 참조 하세요 . 그러나 개발 버전에서는 변경 될 것이라는 메모가 있습니다. 링크 한 위의 단락을 참조하십시오.
ralokt

@tkolar, 정확히 무엇이 오해의 소지가 있습니까? 사용자에게 프로필이없고 get_profile.something을 호출하면 오류가 발생합니다.
Sergey Golovchenko

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 }}

샘플 결과는 다음과 같습니다.

사용자 : 감사관 ezio

사용자 그룹 : auditGroup

사용자 이름 : testUser03

이메일 : testuser03@auditor.com

세션 시작-2018 년 4 월 16 일 오후 9:38

감사 :)


1

작동 중!

프로필 모델에서 related_name 제공

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

그런 다음 템플릿 사용. 여기서 company_name은 프로필 테이블의 필드입니다.

{{ request.user.user_profile.company_name }}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.