2013-06-10 7 views
24

क्षमा करें अगर आपने इससे पहले पूछा था तो आपने मेरी मदद करने की कोशिश की। उस प्रश्न को हटाना पड़ा क्योंकि मुझे किसी कारण से अतिरिक्त जानकारी संपादित करने की अनुमति नहीं दी गई थी।django टेम्पलेट में user.is_authenticated के साथ परेशानी होने के कारण

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

{% if request.user.is_authenticated %} 
     <li><a href="/logout">Log Out</a></li> 
     {% else %} 
     <li><a href="/login">Log In</a></li> 
     {% endif %} 

यहां तक ​​कि जब मैं में लॉग इन कर रहा हूँ के बजाय "बाहर लॉग इन करें" एक विकल्प के रूप में, यह अभी भी प्रदर्शित कर रहा है "प्रवेश करें"। हालांकि, अगर मैं लिंक पर क्लिक करता हूं, तो यह मुझे/प्रोफ़ाइल पर रीडायरेक्ट करेगा क्योंकि अगर मैं लॉग इन हूं तो दृश्य यह करने के लिए कहता है। इसलिए, स्पष्ट रूप से यह जानता है कि मैं लॉग इन हूं, लेकिन टेम्पलेट नहीं है readint user.is_authenticated सत्य के रूप में।

अनुरोधों के लिए लॉग इन करने के लिए संबंधित दृश्य है:

def LoginRequest(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/profile/') 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      profile = authenticate(username=username, password=password) 
      if profile is not None: 
       login(request, profile) 
       return HttpResponseRedirect('/profile/') 
      else: 
       return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request)) 
     else: 
      return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request)) 
    else: 
     ''' user is not submitting the form, show them login form ''' 
     form = LoginForm() 
     context = {'form': form} 
     return render_to_response('template/login.html', context, context_instance = RequestContext(request)) 

उत्तर

40

प्रमाणन संदर्भ प्रोसेसर सक्षम है, तो उसके बाद user पहले से ही टेम्पलेट संदर्भ में है, और आप कर सकते हैं:

{% if user.is_authenticated %} 

आप तो टेम्पलेट में request तक पहुंच बनाना चाहते हैं, सुनिश्चित करें कि आपने request context processor सक्षम किया है।

आपके प्रश्न में आप render_to_response का उपयोग कर रहे हैं। Django 1.3 के बाद से, render_to_response के बजाय render का उपयोग करना बेहतर रहा है। render_to_responseRequestContext(request) के साथ Django < = 1.9 में काम करता है, लेकिन Django 1.10 से आगे आपको संदर्भ प्रोसेसर काम करने के लिए render शॉर्टकट का उपयोग करना होगा।

return render(request, 'template/login.html', context) 
+0

मेरे टेम्पलेट संदर्भ प्रोसेसर हैं ("django.contrib.auth.context_processors.auth लागू करने के साथ यह कर सकते हैं आप true या false की तरह अपने जावास्क्रिप्ट मूल्य के लिए उदाहरण के लिए पारित करने के लिए की जरूरत है ", " 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 ") क्या अनुरोध एक? – Xonal

+0

पथ डॉक्स मैं से जुड़ा हुआ में दी गई है करने के लिए पथ है। – Alasdair

+0

ओह, मुझे नहीं पता था मैं अनुरोध छोड़ दिया है। user.is_authenticated। मैंने इसे जोड़ने का प्रयास किया क्योंकि मैंने सोचा था कि इससे मदद मिलेगी, लेकिन ऐसा नहीं हुआ। टेम्पलेट "अनुरोध" के साथ या उसके बिना काम नहीं करता है। – Xonal

4

पता है कि Django 1.10 के बाद से is_authenticated@property साथ सजाया गया है हो सकता है और यह व्यवहार में अंतर होता।

लिए अप्रमाणित उपयोगकर्ता बुला {{user.is_authenticated}} परिणाम:

CallableBool(True) (जब Django < 1.10 पर यह था True)

लिए उपयोगकर्ता बुला प्रमाणीकृत {{} user.is_authenticated } परिणाम:

CallableBool(False) (जब Django < 1.10 पर यह False था)

आप फिल्टर |yesno:"true,false"

<script language="javascript"> 
var DJANGO_USER = "{{user.is_authenticated|yesno:"true,false"}}"; 
</script> 
संबंधित मुद्दे