Django: लॉगिन के बाद पिछले पृष्ठ पर रीडायरेक्ट करें


175

मैं एसओ पर यहाँ एक के समान लॉगिन कार्यक्षमता के साथ एक सरल वेबसाइट बनाने की कोशिश कर रहा हूँ। उपयोगकर्ता साइट को एक अनाम उपयोगकर्ता के रूप में ब्राउज़ करने में सक्षम होना चाहिए और हर पृष्ठ पर एक लॉगिन लिंक होगा। लॉगिन लिंक पर क्लिक करने पर उपयोगकर्ता को लॉगिन फॉर्म में ले जाया जाएगा। एक सफल लॉगिन के बाद उपयोगकर्ता को उस पृष्ठ पर वापस ले जाना चाहिए जहां से उसने पहली बार में लॉगिन लिंक पर क्लिक किया था। मैं अनुमान लगा रहा हूं कि मुझे वर्तमान पृष्ठ के url को उस दृश्य को पास करना है जो लॉगिन फ़ॉर्म को संभालता है लेकिन मैं वास्तव में इसे काम करने के लिए नहीं प्राप्त कर सकता हूं।

संपादित करें: मुझे यह पता चला। मैंने वर्तमान पृष्ठ को GET पैरामीटर के रूप में पास करके लॉगिन फ़ॉर्म से जोड़ा और फिर उस पृष्ठ पर पुनर्निर्देशित करने के लिए 'अगला' का उपयोग किया। धन्यवाद!

EDIT 2: मेरा स्पष्टीकरण स्पष्ट नहीं लग रहा था, क्योंकि यहां अनुरोध किया गया है कि मेरा कोड है: हमें बताएं कि हम एक पृष्ठ foo.html पर हैं और हम लॉग इन नहीं हैं। अब हम चाहेंगे कि foo.html पर एक लिंक हो। login.html करने के लिए। वहां हम लॉगिन कर सकते हैं और फिर foo.html पर पुनः निर्देशित कर सकते हैं। Foo.html पर लिंक इस तरह दिखता है:

      <a href='/login/?next={{ request.path }}'>Login</a> 

अब मैंने एक कस्टम लॉगिन दृश्य लिखा है जो कुछ इस तरह दिखता है:

def login_view(request):
   redirect_to = request.REQUEST.get('next', '')
   if request.method=='POST':
      #create login form...
      if valid login credentials have been entered:
         return HttpResponseRedirect(redirect_to)  
   #...
   return render_to_response('login.html', locals())

और login.html में महत्वपूर्ण पंक्ति:

<form method="post" action="./?next={{ redirect_to }}">

तो हाँ यह बहुत ज्यादा है, उम्मीद है कि यह स्पष्ट करता है।


1
मुझे लगता है कि Django लॉगिन सामान आपके लिए संभालता है, क्या यह आपके लिए काम नहीं कर रहा है?
डोमिनिक रॉगर

जवाबों:


151

आपको इसके लिए एक अतिरिक्त दृश्य बनाने की आवश्यकता नहीं है, कार्यक्षमता पहले से ही अंतर्निहित है।

लॉगिन लिंक के साथ पहले प्रत्येक पृष्ठ को वर्तमान पथ को जानने की जरूरत है, और सबसे आसान तरीका सेटिंग्स के लिए अनुरोध संदर्भ प्रीप्रोसेसर जोड़ना है (4 पहले डिफ़ॉल्ट हैं), फिर अनुरोध वस्तु प्रत्येक अनुरोध में उपलब्ध होगी:

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",
)

फिर उस टेम्पलेट में जोड़ें जिसे आप लॉगिन लिंक चाहते हैं:

base.html:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>

यह लॉगिन पृष्ठ पर एक GET तर्क जोड़ देगा जो वर्तमान पृष्ठ पर वापस इंगित करता है।

लॉगिन टेम्प्लेट तब इस प्रकार सरल हो सकता है:

पंजीकरण / login.html:

{% block content %}
<form method="post" action="">
  {{form.as_p}}
<input type="submit" value="Login">
</form>
{% endblock %}

47
मैं व्यक्तिगत रूप से इस समाधान का उपयोग करता हूं, लेकिन मैं जो एक संशोधन करूंगा वह यह है कि यदि request.pathयह अशक्त है तो यह विफल हो जाता है, इसलिए मैं इसे बनाता हूं {% firstof request.path '/' %}, यदि उपयोगकर्ता किसी कारण से होम पेज पर भेजा जाता है तो अनुरोध पथ उपलब्ध नहीं है।
१६:११ पर जोरेली

1
मैं आपके समाधान को लागू करने का प्रयास कर रहा हूं, लेकिन जब django.contrib.auth.views.login रीडायरेक्ट (सफलतापूर्वक प्रमाणों के बाद) उपयोगकर्ता का उदाहरण अनुरोध में नहीं है, तो user.is_authenticated () हमेशा गलत रिटर्न देता है। कोई मदद?
जूंकिस्मिथ

3
@Jorelli के शीर्ष पर जोड़कर, आप नामित URL का उपयोग कर सकते हैं और इसके <a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>बजाय कर सकते हैं ।
hobbes3

12
यदि लॉग आउट करने के बाद उपयोगकर्ता लॉग इन करता है, तो आपको यह भी देखना होगा। दूसरे शब्दों में, nextकुछ ऐसा होगा /accounts/logout/और उपयोगकर्ता लॉग इन के बाद, वह तुरंत वापस लोल से लॉग आउट हो जाएगा, और लूप जारी रहता है।
hobbes3

2
मैंने पाया कि यह केवल तब काम करता है जब मैंने Django 1.5 पर लॉगिन फ़ॉर्म में निम्नलिखित जोड़ा: <इनपुट प्रकार = "छिपा हुआ" नाम = "अगला" मान = "{{अगला}}" />
एलिस पर्किवल

28

यह एक "सर्वोत्तम अभ्यास" नहीं हो सकता है, लेकिन मैंने इससे पहले सफलतापूर्वक इसका उपयोग किया है:

return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))

10
इसका एक कमजोर बिंदु है - कुछ उपयोगकर्ता / ब्राउज़र ने पासिंग रेफर को बंद कर दिया है
टॉमाज़ ज़िलिस्की

4
उस स्थिति में भी समस्या होती है जब कोई उपयोगकर्ता किसी प्रपत्र पर आता है, जानकारी में भरता है और फिर सबमिट करता है। HTTP_REFERER तब फॉर्म पेज का URL होता है, न कि उस पेज का URL जिसे उपयोगकर्ता पहले स्थान से आया है।
लॉन्ड्रोमैट

25

परम / मूल्यों के साथ पूर्ण यूआरएल का समर्थन करने के लिए आपको आवश्यकता होगी:

?next={{ request.get_full_path|urlencode }}

इसके बजाय बस:

?next={{ request.path }}

वास्तव में यह एक अच्छा विचार नहीं है, यदि आप बहुत अधिक क्लिक करते हैं, तो आपको क्वेरी स्ट्रिंग बहुत लंबी मिलेगी
dspjm

14

Django का अंतर्निहित प्रमाणीकरण आपके इच्छित तरीके से काम करता है।

उनके लॉगिन पृष्ठों में एक शामिल है next क्वेरी स्ट्रिंग शामिल है जो लॉगिन के बाद वापस आने के लिए पृष्ठ है।

को देखो http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required


4
ठीक है, login_required डेकोरेटर ठीक उसी तरह काम करेगा जैसे मैं जिस भी पेज से आता हूं, वह 'अगला' सेट करता है, लेकिन डेकोरेटर अनाम यूजर्स कैंट साइट को देखने के बाद क्योंकि वे तुरंत लॉगिन फॉर्म पर रीडायरेक्ट हो जाएंगे। मुझे लगता है कि मुझे केवल यह पता लगाने की आवश्यकता है कि उपयोगकर्ता जिस पृष्ठ से आता है, उसके यूआरएल के 'अगले' के मूल्य को कैसे सेट किया जाए।
jörg

1

मैंने वर्तमान पृष्ठ को GET पैरामीटर के रूप में पास करके लॉगिन फ़ॉर्म से जोड़ा और फिर उस पृष्ठ पर पुनर्निर्देशित करने के लिए 'अगला' का उपयोग किया। धन्यवाद!


1

मैंने उसी समस्या का सामना किया। यह समाधान मुझे जेनेरिक लॉगिन दृश्य का उपयोग करने की अनुमति देता है:

urlpatterns += patterns('django.views.generic.simple',
    (r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}),
)

1

में registration/login.html( templatesफ़ोल्डर के भीतर नेस्टेड ) यदि आप निम्नलिखित पंक्ति सम्मिलित करते हैं, तो पृष्ठ Django के मूल व्यवस्थापक लॉगिन पृष्ठ की तरह प्रस्तुत करेगा:

{% include "admin/login.html" %}

नोट: फ़ाइल में केवल ऊपर की पंक्तियाँ होनी चाहिए।


-1

विचारों के लिए django डॉक्स देखें। क्लोजिन () , आप एक सफल लॉगिन के बाद रीडायरेक्ट करने के लिए इनपुट फॉर्म पर 'नेक्स्ट' मान (छिपे हुए क्षेत्र के रूप में ) की आपूर्ति करते हैं।


हां, लेकिन मैं उस पृष्ठ के लिए वास्तव में 'अगला' कैसे सेट कर सकता हूं, जिससे मैं आता हूं?
13:30

-3

आप यह भी कर सकते हैं

<input type="hidden" name="text" value="{% url 'dashboard' %}" />

गलत उत्तर, लेकिन नाम = 'अगला' संभव लगता है, परीक्षण नहीं।
वीज़होंगटू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.