2012-11-01 14 views
27

मैं Django उपयोग कर रहा हूँ उपयोगकर्ता लॉगिन के लिए ध्यान में रखते हुए बनाया गया:दूसरा उपयोगकर्ता लॉगिन मुझे/accounts/profile/url पर रीडायरेक्ट क्यों करता है?

url(r'^user/login/$', 'django.contrib.auth.views.login', {'template_name': 'users/templates/login.html'}, name='user-login'), 

प्रवेश करने के बाद जब मैं गोटो उपयोगकर्ता/लॉगिन फिर मैं दूसरी बार के लिए लॉग इन कर सकते हैं। मैं फॉर्म जमा करता हूं और प्राप्त करता हूं:

वर्तमान यूआरएल, खाते/प्रोफाइल/इनमें से किसी से मेल नहीं खाता।

मैं urls.py में इस यूआरएल की घोषणा नहीं की है।

मैं क्या गलत कर रहा हूं? फ्रेमवर्क इस यूआरएल पर रीडायरेक्ट क्यों करना चाहते हैं?

उत्तर

61

django.contrib.auth.views.loginaccounts/profile/ को रीडायरेक्ट सही होने के बाद आप लॉग इन करें।
आप आप की तरह कुछ भी करने के लिए अपने settings.py फाइल के अंदर LOGIN_REDIRECT_URL सेट कर सकते हैं ..

+5

यह सही है, हालांकि यह अजीब है कि इसे कहीं भी रीडायरेक्ट करने के लिए कोड किया गया है जो अस्तित्व में नहीं है। निश्चित रूप से '/' पर रीडायरेक्ट करना एक और समझदार डिफ़ॉल्ट होगा? –

+0

महान काम किया। पाठ को "LOGIN_REDIRECT_URL = ('..')" में जोड़कर सेटिंग.py ने मेरे लिए उपयोगकर्ता को डिफ़ॉल्ट मुख्य पृष्ठ पर रीडायरेक्ट करने के लिए काम किया। – Praxiteles

+0

मेरा दिन बचाया :) – Humoyun

6

Explained in doc:

(खातों/प्रोफ़ाइल/है ...) यूआरएल जब contrib.auth.login दृश्य नहीं अगले पैरामीटर होता है, जिसमें अनुरोध प्रवेश के बाद पुनः निर्देशित कर रहे हैं।

क्योंकि आपने अभी तक प्रमाणित किया है कि आपका अनुरोध इस यूआरएल पर रीडायरेक्ट किया गया है। रीडायरेक्ट से बचने के लिए आपको user/login पर भेजने से पहले उपयोगकर्ता को लॉगआउट करना चाहिए, अपना कस्टम लॉगिन व्यू या append Next parameter बनाएं।

1

अपने login.html जाँच

<form method="post" action="."> 
    ~blah~ 
    <input type="hidden" name="next" value="/"><!-- login.html must send "next" parameter, and "next" parameter value is url that you want to redirect. --> 
    ~blah~ 
</form> 

अच्छा भाग्य ~

1

यह सब मेरे लिए काम नहीं किया।

login.html में (जहां सामाजिक लॉगिन बटन होते हैं) मैं इस स्क्रिप्ट जो स्थानीय भंडारण ::

<script> 
// Check for local storage 
if (typeof(Storage) !== "undefined") { 
    var h = window.location.href; 
    if (h.indexOf("next") > 0){ 
     var tokens = h.split("="); 
     var nextUrl = tokens[1]; 

     for(i = 2;i< tokens.length;i++){ 
      nextUrl += ("=" + tokens[i]); 
     } 
     localStorage.setItem("next",nextUrl); 

    } 
} 
</script> 

में अगले पृष्ठ में संग्रहीत करता है जहाँ उपयोगकर्ताओं को किया जा रहा है डाल: मैं एक जावास्क्रिप्ट समाधान के लिए इस्तेमाल किया

उदाहरण के लिए, आप के लिए है: बहुत अच्छा समाधान प्रदान

$(document).ready(function() { 

    // Check for local storage 
    if (typeof(Storage) !== "undefined") { 
      var nextUrl = localStorage.getItem("next"); 
      if (nextUrl.length > 0){ 
       localStorage.setItem("next",""); 
       window.location = nextUrl; 
      } 
    } 
    else { 
     // Sorry! No web storage support.. 
    } 
} 
3

@CpS, मैं सिर्फ यह एक छोटा सा बढ़ाने के लिए चाहते हैं: मैं के लिए पुनः निर्देशित रीडायरेक्ट करने के लिए निम्न स्क्रिप्ट का इस्तेमाल किया llowing यूआरएल:

urlpatterns = [ 
    # django's login/logout 
    url(r'login/$', 'django.contrib.auth.views.login', name='login'), 
    url(r'logout/$', 'django.contrib.auth.views.logout', name='logout'), 
    url(r'logout-then-login/$', 'django.contrib.auth.views.logout_then_login', name='logout_then_login'), 
    url(r'^$', views.dashboard, name='dashboard') 
] 

और dashboard.html जगह है जहाँ आप सफल प्रवेश के बाद रीडायरेक्ट करना चाहते हैं, तो आप अपने settings.py फ़ाइल तदनुसार संशोधित कर सकते हैं:

from django.core.urlresolvers import reverse_lazy 

LOGIN_REDIRECT_URL=reverse_lazy('dashboard') 
LOGIN_URL=reverse_lazy('login') 
LOGOUT_URL=reverse_lazy('logout') 

हम reverse_lazy() उपयोग कर रहे हैं यूआरएल को गतिशील बनाने के लिए। reverse_lazy() फ़ंक्शन reverse() की तरह यूआरएल को उलट देता है, लेकिन जब आप अपने प्रोजेक्ट की यूआरएल कॉन्फ़िगरेशन लोड होने से पहले यूआरएल को रिवर्स करते हैं तो आप इसका इस्तेमाल कर सकते हैं।