Django : 템플릿 내에서 세션 변수에 액세스하십니까?


133

Django에서 세션 변수를 설정하면 다음과 같습니다.

request.session["name"] = "name"

템플릿 내에서 액세스 할 수있는 방법이 있습니까, 아니면보기 내에서 검색 한 다음 템플릿으로 전달해야합니까?

템플릿 내에서 액세스하고 싶은 약 10 개의 작은 세션 변수가 있기 때문에 묻고 10을 뷰에서 템플릿으로 전달하면 약간 지저분해질 수 있습니다.

(HttpResponseRedirect이기 때문에 세션 변수를 사용해야하지만 데이터베이스에 변수를 저장하는 것은 과도합니다.)

따라서 템플릿 내에서 직접 세션 변수를 가져 오는 방법은 무엇입니까?

답변:


224

템플릿 컨텍스트 프로세서 에 추가 django.core.context_processors.request해야합니다 . 그런 다음 다음과 같이 액세스 할 수 있습니다.

{{ request.session.name }}

사용자 정의보기를 사용하는 경우 RequestContext 인스턴스를 전달하는지 확인하십시오. 문서 에서 가져온 예 :

from django.shortcuts import render_to_response
from django.template import RequestContext

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

2013 업데이트 : 이 답변에 대해 여전히 받고있는 공감대에 의해 사람들은 원래 작성된 후 3 년 이상이 도움이되는 것으로 나타났습니다. 그러나 위의 뷰 코드는 여전히 유효하지만 요즘에는 훨씬 간단한 방법이 있습니다. render()와 매우 유사한 함수 render_to_response()이지만 RequestContext명시 적으로 전달할 필요없이 자동으로 사용 됩니다.

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)

9
기본값을 무시하지 않고 django.core.context_processors.request를 템플리트 컨텍스트 프로세서에 추가하는 방법 은 stackoverflow.com/questions/2246725/… 를 참조하십시오 .
Rick Westera

render 대신 HttpResponse를 사용하면 템플릿에서 세션 속성을 계속 얻을 수 있습니다. 혼란스러워하십시오.
cafebabe1991

무슨 뜻이야? 이 HttpResponse수업은 템플릿을 전혀 다루지 않으므로 질문과 관련이없는 것 같습니다.
Ludwik Trammer

나중에, 실제로 나는 그것을 마지막에 그것을 깨닫기 위해 실험을했다. 나쁜 질문. 죄송합니다
cafebabe1991

18

request.session 는 다른 사전과 마찬가지로 속성과 멤버에 일반적인 템플릿 메커니즘을 사용합니다.

{{ request.session.name }}

요청을 템플릿 컨텍스트로 전달하는 것을 잊지 말고 RequestContext를 사용하고 요청 컨텍스트 프로세서를 활성화해야합니다. 설명서를 참조하십시오 .


11

Django 1.9 (2016 년 3 월)를 사용하고 있으며 {{ request.session.name}}작동하려면 설정에 다음이 있습니다.

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

이전 답변의 차이는 다음과 같습니다 'django.core.context_processors.request'되었다'django.template.context_processors.request'


2
장고 1.10에서 django.template.context_processors.request이미 설정 파일에있었습니다 : D
Thai Tran

6

request변수를 템플릿에 전달할 수 있으며 다음을 사용합니다.

{{ request.session.name }}

2

먼저 인쇄 request.session.keys()한 후

request.session['_auth_user_id']
request.session['_auth_user_backend']

이 두 세션 변수를 얻게됩니다.


2

가장 간단한 구현은 if 루프를 사용하는 것입니다.

{% if 'data' in request.session %}

1

settins.py에서

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

당신의 관점은 다음과 같습니다.

from django.shortcuts import render_to_response, render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext

@login_required()
def index_admin(request):
    return render_to_response('carteras/index_admin.html', {}, context_instance=RequestContext(request))

또한 'django.contrib.auth.context_processors.auth'를 TEMPLATE_CONTEXT_PROCESSORS 튜플에 추가해야했습니다.
Tony

1

@Ludwik Trammer 답변 계속, TEMPLATE_CONTEXT_PROCESSORS 추가 방법

django 1.6의 경우 settings.py에서 아래 코드를 참조하는 TEMPLATE_CONTEXT_PROCESSORS를 추가 한 다음 {{ request.session.name }}템플릿 파일에서 사용하십시오.

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request")

참조 https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Pls는 설정에서 완전한 코드를 사용해야합니다. "django.core.context_processors.request"단독으로 사용 하면 기본 설정이 무시됩니다.


0

아마 지금 너무 늦었을 것입니다. TEMPLATE_CONTEXT_PROCESSORS에서 직접 설정 settings.py하면 모든 기본값이 손실됩니다 TEMPLATE_CONTEXT_PROCESSORS. 여기에 내가하는 일이 있습니다 settings.py.

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.