2008-09-03 25 views
27

मैं एक छोटी कंपनी के लिए एक छोटी इंट्रानेट साइट पर काम कर रहा हूं, जहां उपयोगकर्ता पोस्ट करने में सक्षम होना चाहिए। मैंने एक बहुत ही सरल प्रमाणीकरण तंत्र की कल्पना की है जहां लोग सिर्फ अपना ईमेल पता दर्ज करते हैं, और एक अद्वितीय लॉगिन यूआरएल भेजा जाता है, जो एक कुकी सेट करता है जो हमेशा उन्हें भविष्य के अनुरोधों के लिए पहचानता है।हमेशा django टेम्पलेट संदर्भ में उपयोगकर्ता सहित

मेरे टेम्पलेट सेटअप में, मेरे पास base.html है, और अन्य पृष्ठ इसका विस्तार करते हैं। मैं base.html में लॉग इन या रजिस्टर बटन दिखाना चाहता हूं, लेकिन मैं कैसे सुनिश्चित कर सकता हूं कि आवश्यक चर हमेशा संदर्भ का हिस्सा हैं? ऐसा लगता है कि प्रत्येक दृश्य सिर्फ संदर्भ को सेट करता है जैसा कि उन्हें पसंद है, और कोई वैश्विक संदर्भ आबादी नहीं है। क्या प्रत्येक संदर्भ निर्माण में उपयोगकर्ता को शामिल किए बिना ऐसा करने का कोई तरीका है?

या मुझे संदर्भ को सही तरीके से सेटअप करने के लिए अपने स्वयं के कस्टम शॉर्टकट बनाना होगा?

उत्तर

18

प्रत्येक दृश्य में स्पष्ट रूप से चर सेट करने की अधिक सामान्य समझ में, ऐसा लगता है कि आप अपना खुद का context processor लिखना चाहते हैं।

डॉक्स से:

एक संदर्भ प्रोसेसर एक बहुत ही सरल इंटरफ़ेस है: यह सिर्फ एक अजगर समारोह है कि एक तर्क, एक HttpRequest वस्तु लेता है, और एक शब्दकोश टेम्पलेट संदर्भ में जोड़ दी जाती है कि रिटर्न है। प्रत्येक संदर्भ प्रोसेसर को एक शब्दकोश वापस करना होगा।

2

यदि आप Django authentication scheme में अपना प्रमाणीकरण हुक कर सकते हैं तो आप request.user का उपयोग करने में सक्षम होंगे।

मुझे लगता है कि यह आपकी कुकी की सामग्री के आधार पर authenticate() और login() पर कॉल करने का मामला होना चाहिए।

संपादित करें: @Staale - मैं हमेशा अपने संदर्भ के लिए locals() trick का उपयोग करता हूं, इसलिए मेरे सभी टेम्पलेट request और request.user देख सकते हैं। यदि आप नहीं हैं तो मुझे लगता है कि यह इतना सरल नहीं होगा।

2

@Dave उपयोग करने के लिए {{user.username}} मेरे टेम्पलेट में, मैं तो सिर्फ एक सामान्य नक्शा/हैश बजाय requestcontext का उपयोग करना होगा: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

तो मुझे लगता है कि वहाँ कोई नहीं है ग्लोबल जो टेम्पलेट इंजन की जांच करता है।

लेकिन अनुरोधकॉन्टेक्स्ट में कुछ पूर्ववर्ती कक्षाएं हैं जिन्हें मैं अपनी समस्याओं को हल करने के लिए देख सकता हूं। धन्यवाद।

32

@Ryan: preprocessors के बारे में प्रलेखन थोड़ा छोटा है

@Staale:, प्रसंग हर बार एक ही दृश्य में टेम्पलेट बुला रहा है करने के लिए उपयोगकर्ता को जोड़ने सूखी

समाधान एक पूर्वप्रक्रमक

उपयोग करने के लिए है

एक: में अपनी सेटिंग्स जोड़ने

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user', 
) 

बी: myapp/processor_file_name में।पाई डालने

def user(request): 
    if hasattr(request, 'user'): 
     return {'user':request.user } 
    return {} 

अब से आप अपने टेम्पलेट्स में उपयोगकर्ता ऑब्जेक्ट कार्यक्षमताओं का उपयोग करने में सक्षम हैं।

{{ user.get_full_name }} 
+0

Django आदेश व्यवस्थापक application.' उपयोग करने के लिए और अगर मैं ऐसा, टेम्पलेट्स अभी भी के बारे में पता नहीं है में स्थापित करने के लिए अपने TEMPLATE_CONTEXT_PROCESSORS में त्रुटि 'रखो 'django.contrib.auth.context_processors.auth' देता है 'user'। – hobbes3

+4

@ hobbes3 क्योंकि आप RequestContext का उपयोग नहीं कर रहे हैं, संदर्भ प्रोसेसर निष्पादित नहीं होते हैं। –

+0

@rebus असल में मेरे 'views.py' में, मैं' render_to_resposne' का उपयोग करके एक सरल शब्दकोश के साथ गुजर रहा हूं, जैसा कि 'RequestContext' का विरोध करता है। सहायता के लिए धन्यवाद। – hobbes3

43

वहाँ कोई जरूरत उपयोगकर्ता वस्तु के लिए एक संदर्भ प्रोसेसर लिखने के लिए अगर आप पहले से TEMPLATE_CONTEXT_PROCESSORSऔर में "django.core.context_processors.auth" है अगर आप अपने विचारों में RequestContext का उपयोग कर रहे है।

अगर आप Django 1.4 या नवीनतम मॉड्यूल का उपयोग कर रहे डिफ़ॉल्ट रूप से इसके संभावित django.contrib.auth.context_processors.auth

+3

यह टेम्पलेट संदर्भ चर उपलब्ध नहीं है यदि RequestContext का उपयोग नहीं किया जा रहा है। – zalun

+0

सच है, आपको [RequestContext] (https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext) का उपयोग करना होगा –

+4

रेंडर() (https: // दस्तावेज़ों का उपयोग करें) का उपयोग करना होगा। Djangooproject.com/en/dev/topics/http/shortcuts/#render) Django 1.3 से हमेशा अनुरोधकॉन्टेक्स्ट को स्वचालित रूप से शामिल करने के लिए। –

1

ले जाया गया है, निम्न चरणों करने से, सुनिश्चित करें कि आप संदर्भ 'django.contrib.auth.context_processors.auth जोड़ लिया है 'आपकी सेटिंग्स में। डिफ़ॉल्ट रूप से अपने settings.py में जोड़ा है, इसलिए इस तरह इस

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

और आप उपयोग कर सकते हैं उपयोगकर्ता वस्तु की तरह अपने दिखता है,

{% if user.is_authenticated %} 
<p>Welcome, {{ user.username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 

अधिक जानकारी के लिए, यहां देखें http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

+2

आपको संदर्भ के बजाय RequestContext का उपयोग करने की भी आवश्यकता है ये मामला। –

3

संकेत प्रत्येक उत्तर में हैं, लेकिन एक बार फिर, "स्क्रैच" से, नए लोगों के लिए:

प्रमाणीकरण डेटा डिफ़ॉल्ट रूप से टेम्पलेट्स (लगभग) में है - एक छोटी सी चाल के साथ:

views.py में:

from django.template import RequestContext 
... 
def index(request): 
    return render_to_response('index.html', 
           {'var': 'value'}, 
           context_instance=RequestContext(request)) 

index.html में:

... 
Hi, {{ user.username }} 
var: {{ value }} 
... 

यहाँ से: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

इस टेम्पलेट संदर्भ चर यदि उपलब्ध हो एक RequestContext नहीं बी है नहीं है एनजी इस्तेमाल किया।