2008-12-02 12 views
23

मैं Django में एक कस्टम टैग लिख रहा हूं जिसे उपयोगकर्ता सत्र में संग्रहीत मूल्य आउटपुट करना चाहिए, लेकिन मुझे कस्टम टैग फ़ंक्शन के भीतर सत्र ऑब्जेक्ट तक पहुंचने का कोई तरीका नहीं मिल रहा है। क्या ऐसा करने का कोई तरीका है, मैन्युअल रूप से संदर्भ ऑब्जेक्ट को सत्र ऑब्जेक्ट को असाइन किए बिना?Django में, क्या वर्तमान उपयोगकर्ता सत्र को कस्टम टैग के भीतर से एक्सेस करना संभव है?

उत्तर

23

आप अपने settings.py फ़ाइल में अनुरोध संदर्भ प्रोसेसर जोड़ने के लिए सक्षम होना चाहिए:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
'django.core.context_processors.request',) 

यह कस्टम फ़ाइल जोड़ने के बिना, वर्तमान उत्तर के समान ही काम करेगा। http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

आप उपयोगकर्ता की जानकारी हड़पने के लिए और एक स्थानीय धागे से संग्रहीत, और फिर अपने टैग की परिभाषा के साथ उपयोग मिडलवेयर उपयोग कर सकते हैं:

+0

मैं इस दृष्टिकोण का जवाब स्विचिंग, यह क्लीनर है की सलाह देते हैं लगता है। –

+0

मेरे पास पहले से ही प्रीप्रोसेसर था, लेकिन सत्र संपत्ति को अनदेखा कर दिया होगा। डी 'ओह! धन्यवाद। – knabar

+0

मैंने इसे जोड़ा है, लेकिन मैं टेम्पलेट के भीतर से अनुरोध का उपयोग कैसे करूं? context.session मौजूद नहीं है। – Wouter

4

आप कस्टम संदर्भ प्रोसेसर के साथ ऐसा कर सकते हैं (http://docs.djangoproject.com/en/dev/ref/templates/api/ देखें)

इस मामले में, आप अपने settings.py फ़ाइल के रूप में एक ही स्तर पर context_processors.py नामक एक नई फ़ाइल बनाने चाहते हैं, युक्त

def add_session(request): 
    return {'session': request.session} 

फिर, अपने settings.py फ़ाइल में, जोड़ें:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
'context_processors.add_session',) 

अब आप अपने कस्टम टैग में संदर्भ के लिए [ 'सत्र'] का उल्लेख करने में सक्षम हो जाएगा।

ध्यान दें कि यह केवल निम्न कोड के रूप में, एक RequestContext सौंपा साथ गाया टेम्पलेट्स के लिए काम करेंगे:

def test(request): 
    return render_to_response('test.html',{}, context_instance=RequestContext(request)) 
0

मैं इस उपयोगी पाया।

6

कोई अपराध नहीं है, जैसा कि ऐसा लगता है कि सेबस्टियन एक बिंदु पर एक उपयोगी हैक था, लेकिन एडमिन में उपयोगकर्ता डेटा तक पहुंचने के बारे में ब्लॉग एंट्री में 24 दिसंबर को अजीब रूप से पर्याप्त, Django के रिलीज मैनेजर जेम्स बेनेट, यह कहना था about using the threadlocal hack:

एक बड़ी वसा अस्वीकरण: इन प्रकार की विशेषताओं के लिए बहुत सारे उपयोग और संभावित उपयोग हैं। उनमें से कई गलत और बेवकूफ हैं और आपको उनकी कोशिश नहीं करनी चाहिए। ... इसके अलावा, आप कभी-कभी किसी को यह सुझाव देंगे कि इन सुविधाओं को "थ्रेडलोकल हैक" के नाम से जाना जा सकता है; इस मूल रूप से request.user को जादुई वैश्विक रूप से उपलब्ध चर के प्रकार में चिपकाना शामिल है, और अगर आप नहीं जानते कि आप क्या कर रहे हैं तो इसका उपयोग करने के लिए एक बहुत ही बुरी चीज है। यह आमतौर पर उपयोग करने के लिए एक बहुत ही बुरी चीज है, भले ही आप जानते हैं कि आप क्या कर रहे हैं, क्योंकि आप शायद ऐसा कर रहे हैं क्योंकि आप आलसी हैं और आपको यह सुनिश्चित करने की तरह महसूस नहीं होता है कि आप सही तरीके से जानकारी पास करते हैं। तो अगर आप किसी को यह सुझाव देते हुए देखते हैं कि आप इसे "थ्रेडलोकल" का उपयोग करके करते हैं, तो उस व्यक्ति को अनदेखा करें।

कह ऐसा नहीं है कि आप सेबस्टियन अनदेखा कर देना चाहिए, लेकिन यह सार्थक अन्य तरीके का पीछा करने के बजाय threadlocal जो एक सबसे अच्छा अभ्यास नहीं माना जाता है का उपयोग कर हो सकता है।

+0

यह एक महत्वपूर्ण बात है, लेकिन मेरा सुझाव है चाहिए कि प्रोग्रामर पर शायद श्री बेनेट की टिप्पणी शायद उन्हें" सुस्त और आप जानकारी ठीक से चारों ओर से पारित सुनिश्चित lik नहीं लग रहा है "पर उपलब्ध है पूरी तरह से नहीं है निष्पक्ष। Django में एक फिर से होने वाली समस्या यह पता लगा रही है कि जानकारी को सही तरीके से कैसे पास किया जाए। आम तौर पर यह आलसी होने के बारे में नहीं बल्कि आपको आवश्यक चरों तक पहुंच प्राप्त करने के बारे में नहीं है। ने कहा कि; वह स्पष्ट रूप से सही है, कि थ्रेडलोकल हैक एक बहुत बुरी चीज है। – Teekin

संबंधित मुद्दे