django 템플릿 컨텍스트에 항상 사용자를 포함합니다.
-
09-06-2019 - |
문제
저는 사용자가 게시할 수 있어야 하는 소규모 회사의 소규모 인트라넷 사이트에서 작업하고 있습니다.나는 사람들이 자신의 이메일 주소를 입력하고 고유한 로그인 URL을 전송받아 향후 요청에 대해 항상 식별하는 쿠키를 설정하는 매우 간단한 인증 메커니즘을 상상했습니다.
내 템플릿 설정에는 base.html이 있고 다른 페이지에서는 이를 확장합니다.base.html에 로그인 또는 등록 버튼을 표시하고 싶지만 필요한 변수가 항상 컨텍스트의 일부인지 어떻게 확인할 수 있습니까?각 뷰는 원하는 대로 컨텍스트를 설정하고 전역 컨텍스트 인구는 없는 것 같습니다.각 컨텍스트 생성에 사용자를 포함하지 않고 이를 수행하는 방법이 있습니까?
아니면 컨텍스트를 올바르게 설정하려면 나만의 사용자 지정 바로가기를 만들어야 합니까?
해결책
각 뷰에서 변수를 명시적으로 설정할 필요가 없다는 보다 일반적인 의미에서 직접 작성하는 방법을 살펴보고 싶은 것처럼 들립니다. 컨텍스트 프로세서.
문서에서:
컨텍스트 프로세서는 매우 간단한 인터페이스를 가지고 있습니다:이는 하나의 인수인 HttpRequest 객체를 취하고 템플릿 컨텍스트에 추가되는 사전을 반환하는 Python 함수일 뿐입니다.각 컨텍스트 프로세서는 사전을 반환해야 합니다.
다른 팁
있다 필요 없음 이미 가지고 있는 경우 사용자 개체에 대한 컨텍스트 프로세서를 작성하려면 "django.core.context_processors.auth"
~에 TEMPLATE_CONTEXT_PROCESSORS
그리고 당신이 사용하는 경우 RequestContext
당신의 견해에.
django 1.4 또는 최신 버전을 사용하는 경우 모듈이 다음으로 이동되었습니다. django.contrib.auth.context_processors.auth
@라이언:전처리기에 대한 문서가 약간 작습니다.
@스탈레:보기에서 템플릿을 호출할 때마다 컨텍스트에 사용자 추가, DRY
해결책은 전처리기를 사용하는 것입니다.
ㅏ:설정에서 추가하세요
TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
)
비:myapp/processor_file_name.py에 삽입
def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {}
이제부터 템플릿에서 사용자 개체 기능을 사용할 수 있습니다.
{{ user.get_full_name }}
힌트는 모든 답변에 있지만 초보자를 위해 "처음부터" 다시 한 번 설명합니다.
인증 데이터는 기본적으로 (거의) 템플릿에 있습니다. 약간의 트릭이 있습니다.
~에 views.py
:
from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request))
~에 index.html
:
...
Hi, {{ user.username }}
var: {{ value }}
...
여기에서: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
이 템플릿 컨텍스트 변수는 다음과 같은 경우에 사용할 수 없습니다. 요청컨텍스트 사용되지 않습니다.
@dave {{user.username}}을 사용하려면 템플릿에서 일반적인 맵/해시가 아닌 requestContext를 사용해야합니다. http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
그래서 템플릿 엔진이 확인하는 전역 변수가 없는 것 같아요.
그러나 RequestContext에는 문제를 해결하기 위해 조사할 수 있는 미리 채워진 클래스가 있습니다.감사해요.
인증을 연결할 수 있는 경우 Django 인증 체계 당신은 사용할 수 있습니다 request.user
.
이건 그냥 전화하면 될 것 같아요 authenticate()
그리고 login()
귀하의 쿠키 내용을 기반으로 합니다.
편집하다:@Staale - 저는 항상 locals()
장난 내 상황에 맞게 내 모든 템플릿이 볼 수 있도록 request
그래서 request.user
.그렇지 않다면 그렇게 간단하지 않을 것 같아요.
기본적으로 가능합니다. 다음 단계를 수행하여 설정에 'django.contrib.auth.context_processors.auth' 컨텍스트를 추가했는지 확인하세요.기본적으로 settings.py에 추가되므로 다음과 같습니다.
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)
그리고 다음과 같이 사용자 개체에 액세스할 수 있습니다.
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
자세한 내용은 여기를 참조하세요. http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates