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: अपवोट्स को देखते हुए मैं अभी भी इस उत्तर के लिए प्राप्त कर रहा हूं, मूल रूप से लिखे जाने के तीन साल से अधिक समय बाद भी लोग इसे उपयोगी मान रहे हैं। हालांकि, कृपया ध्यान दें कि यद्यपि ऊपर दिया गया दृश्य कोड अभी भी मान्य है, आजकल ऐसा करने का बहुत सरल तरीका है। 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/… देखें ।
रिक वेस्टेरा डे

अगर मैं सौंपनेवाला के बजाय HttpResponse का उपयोग करता हूँ तो क्या मैं अभी भी अपने टेम्पलेट में सत्र विशेषता प्राप्त कर पाऊँगा। मैं उलझन में हूँ कृपया मुझे बताएं
Cafebabe1991

@ Cafebabe1991 आपका क्या मतलब है? HttpResponseवर्ग सब पर टेम्पलेट्स के साथ सौदा नहीं है, इसलिए सवाल प्रासंगिक ... प्रतीत नहीं होता है
Ludwik ट्राम का घोड़ा

हां, वास्तव में मैंने इसे महसूस करने के लिए एक प्रयोग किया था। क्षमा करें
Cafebabe1991

18

request.session किसी भी अन्य की तरह एक शब्दकोश है, इसलिए आप केवल विशेषताओं और सदस्यों के लिए सामान्य टेम्पलेट तंत्र का उपयोग करते हैं:

{{ request.session.name }}

टेम्प्लेट संदर्भ में अनुरोध पास करना न भूलें, या इससे भी बेहतर सुनिश्चित करें कि आप RequestContext का उपयोग कर रहे हैं और अनुरोध संदर्भ प्रोसेसर सक्षम है। प्रलेखन देखें ।


11

मैं Django 1.9 (मार्च 2016) का उपयोग कर रहा हूं और {{ 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
Django 1.10 में, django.template.context_processors.requestपहले से ही सेटिंग फ़ाइल में था: D
थाई ट्रान

6

आप requestएक टेम्प्लेट में एक चर पास कर सकते हैं और वहां उपयोग कर सकते हैं:

{{ request.session.name }}


2

यदि लूप सबसे सरल कार्यान्वयन का उपयोग कर रहा है:

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

1

अपने निपटान में

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 टपल में जोड़ना था।
टोनी

1

@Ludwik Trammer उत्तर जारी रखते हुए, TEMPLATE_CONTEXT_PROCESSORS को कैसे जोड़ा जाए

Django 1.6 के लिए, सेटिंग में Oracle नीचे दिए गए कोड का उल्लेख करते हुए 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',
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.