Django: accéder aux variables de session depuis un modèle?

133

Si je définis une variable de session dans Django, comme:

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

Existe-t-il un moyen d'y accéder à partir d'un modèle, ou dois-je le récupérer à partir d'une vue, puis le transmettre à un modèle?

Demander parce que j'ai environ 10 petites variables de session auxquelles je voudrais accéder dans un modèle, et passer les 10 de la vue au modèle pourrait devenir un peu compliqué.

(Je dois utiliser des variables de session car c'est un HttpResponseRedirect, mais stocker les variables dans une base de données est excessif pour mes besoins.)

Alors - quel moyen de récupérer les variables de session directement dans un modèle?

AP257
la source

Réponses:

224

Vous devez ajouter django.core.context_processors.requestà vos processeurs de contexte de modèle . Ensuite, vous pouvez y accéder comme ceci:

{{ request.session.name }}

Si vous utilisez des vues personnalisées, assurez-vous de transmettre une instance RequestContext. Exemple tiré de la documentation :

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

Mise à jour 2013: à en juger par les votes positifs que je reçois toujours pour cette réponse, les gens la trouvent toujours utile, plus de trois ans après sa rédaction initiale. Veuillez noter cependant que bien que le code de vue ci-dessus soit toujours valide, il existe aujourd'hui un moyen beaucoup plus simple de le faire. render()est une fonction très similaire à render_to_response(), mais elle utilise RequestContextautomatiquement, sans avoir besoin de la passer explicitement:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)
Ludwik Trammer
la source
9
Voir stackoverflow.com/questions/2246725/ ... pour savoir comment ajouter django.core.context_processors.request à vos processeurs de contexte de modèle sans remplacer les valeurs par défaut.
Rick Westera
si j'utilise HttpResponse au lieu de render, serai-je toujours en mesure d'obtenir l'attribut de session dans mon modèle.Je suis confus s'il vous plaît dites-moi
cafebabe1991
@ cafebabe1991 Que voulez-vous dire? La HttpResponseclasse ne traite pas du tout de modèles, donc la question ne semble pas pertinente ...
Ludwik Trammer
Oui, en fait, j'ai fait une expérience pour m'en rendre compte à la fin. Mauvaise question. désolé
cafebabe1991
18

request.session est un dictionnaire comme les autres, vous utilisez donc simplement le mécanisme de modèle normal pour les attributs et les membres:

{{ request.session.name }}

N'oubliez pas de transmettre la demande dans le contexte du modèle, ou mieux encore, assurez-vous que vous utilisez RequestContext et que le processeur de contexte de demande est activé. Consultez la documentation .

Daniel Roseman
la source
11

J'utilise Django 1.9 (mars 2016) et pour me mettre {{ request.session.name}}au travail, mes paramètres ont ceci:

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

La différence avec les réponses précédentes est: est 'django.core.context_processors.request'devenu'django.template.context_processors.request'

lunamystry
la source
2
dans Django 1.10, le django.template.context_processors.requestétait déjà dans le fichier de réglage: D
Thai Tran
6

Vous pouvez passer une requestvariable à un modèle et y utiliser:

{{ request.session.name }}
Lumière argentée
la source
2

Première impression request.session.keys()ensuite

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

Vous obtiendrez ces deux variables de session.

Namita Maharanwar
la source
2

l'implémentation la plus simple utilise la boucle if:

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

Dans votre settins.py

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

Votre point de vue ressemble peut-être à ceci.

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
la source
J'ai également dû ajouter «django.contrib.auth.context_processors.auth» au tuple TEMPLATE_CONTEXT_PROCESSORS.
Tony
1

Poursuivre la réponse @Ludwik Trammer, Comment ajouter TEMPLATE_CONTEXT_PROCESSORS

Pour django 1.6, dans settings.py ajoutez TEMPLATE_CONTEXT_PROCESSORS en vous référant au code ci-dessous, puis utilisez-les {{ request.session.name }}dans les fichiers modèles.

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

Référence https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Veuillez noter que vous devez utiliser ce code complet dans les paramètres. L'utilisation "django.core.context_processors.request"seule entraînera le remplacement des paramètres par défaut.

Sree
la source
0

Peut-être un peu trop tard maintenant. Si vous directement défini TEMPLATE_CONTEXT_PROCESSORSdans settings.py, vous perdrez tout défaut de TEMPLATE_CONTEXT_PROCESSORSvaleur. Voici ce que je fais dans mon 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',
)
lapin.aaron
la source