Django: acessando variáveis ​​de sessão de dentro de um template?

133

Se eu definir uma variável de sessão no Django, como:

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

Existe uma maneira de acessá-lo de dentro de um modelo ou preciso recuperá-lo de uma visualização e depois passá-lo para um modelo?

Perguntar porque eu tenho cerca de 10 variáveis ​​de sessão pequenas que eu gostaria de acessar dentro de um modelo, e passar todas as 10 da visualização para o modelo pode ficar um pouco confuso.

(Preciso usar variáveis ​​de sessão porque é um HttpResponseRedirect, mas armazenar as variáveis ​​em um banco de dados é um exagero para meus propósitos.)

Então - alguma maneira de pegar variáveis ​​de sessão diretamente dentro de um modelo?

AP257
fonte

Respostas:

224

Você precisa adicionar django.core.context_processors.requestaos seus processadores de contexto de modelo . Então você pode acessá-los assim:

{{ request.session.name }}

Caso você esteja usando visualizações personalizadas, verifique se está passando uma instância de RequestContext. Exemplo retirado da documentação :

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

Atualização 2013: A julgar pelos votos positivos que ainda estou recebendo por esta resposta, as pessoas ainda a acham útil, mais de três anos depois que ela foi originalmente escrita. Observe, no entanto, que, embora o código de visualização acima ainda seja válido, hoje em dia existe uma maneira muito mais simples de fazer isso. render()é uma função muito semelhante a render_to_response(), mas usa RequestContextautomaticamente, sem a necessidade de passar explicitamente:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)
Ludwik Trammer
fonte
9
Consulte stackoverflow.com/questions/2246725/… para saber como adicionar django.core.context_processors.request aos seus processadores de contexto de modelo sem substituir os padrões.
23912 Rick Westera
se eu usar HttpResponse em vez de tornar vai ainda ser capaz de obter o atributo sessão em meus template.I estou confuso por favor me diga
cafebabe1991
@ cafebabe1991 O que você quer dizer? A HttpResponseclasse não lidar com modelos em tudo, então a questão não parece relevante ...
Ludwik Trammer
Sim, na verdade eu fiz um experimento para perceber isso no final. desculpe
cafebabe1991
18

request.session é um dicionário como qualquer outro, então você apenas usa o mecanismo de modelo normal para atributos e membros:

{{ request.session.name }}

Não se esqueça de passar a solicitação para o contexto do modelo ou, melhor ainda, garantir que você esteja usando o RequestContext e tenha o processador de contexto da solicitação ativado. Veja a documentação .

Daniel Roseman
fonte
11

Estou usando o Django 1.9 (março de 2016) e, para começar {{ request.session.name}}a trabalhar, minhas configurações têm o seguinte:

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',
            ],
        },
    },
]

A diferença das respostas anteriores é: 'django.core.context_processors.request'tornou - se'django.template.context_processors.request'

lunamystry
fonte
2
no Django 1.10, o django.template.context_processors.requestarquivo já estava no arquivo de configuração: D
Thai Tran
6

Você pode passar uma requestvariável para um modelo e usar:

{{ request.session.name }}
Luz cinza
fonte
2

Primeiro imprima request.session.keys()então

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

Você receberá essas duas variáveis ​​de sessão.

Namita Maharanwar
fonte
2

a implementação mais simples é usando o loop if:

{% if 'data' in request.session %}
cryptoKTM
fonte
1

Nos seus settins.py

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

Sua opinião, talvez seja assim.

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))
Pjl
fonte
Também tive que adicionar 'django.contrib.auth.context_processors.auth' à tupla TEMPLATE_CONTEXT_PROCESSORS.
Tony
1

Continuando a resposta do @Ludwik Trammer, Como adicionar TEMPLATE_CONTEXT_PROCESSORS

Para o django 1.6, em settings.py, adicione TEMPLATE_CONTEXT_PROCESSORS consultando o código abaixo e use {{ request.session.name }}nos arquivos de modelo.

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")

Referência https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Por favor, note que você deve usar esse código completo nas configurações. Usar "django.core.context_processors.request"sozinho resultará na substituição das configurações padrão.

Sree
fonte
0

Talvez um pouco tarde demais agora. Se você definir diretamente TEMPLATE_CONTEXT_PROCESSORSno settings.py, você vai perder todo o padrão TEMPLATE_CONTEXT_PROCESSORSde valor. Aqui está o que eu faço no meu 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',
)
rabbit.aaron
fonte