জাঙ্গো: লগইন করার পরে পূর্ববর্তী পৃষ্ঠায় পুনর্নির্দেশ করুন


175

লগ ইন কার্যকারিতা সহ আমি এখানে একটি অনুরূপ অনুরূপ একটি সাধারণ ওয়েবসাইট তৈরি করার চেষ্টা করছি। ব্যবহারকারীর অনামী ব্যবহারকারী হিসাবে সাইটটি ব্রাউজ করতে সক্ষম হওয়া উচিত এবং প্রতিটি পৃষ্ঠায় লগইন লিঙ্ক থাকবে। লগইন লিঙ্কে ক্লিক করার সময় ব্যবহারকারীকে লগইন ফর্মটিতে নেওয়া হবে। একটি সফল লগইন করার পরে ব্যবহারকারীকে সেই পৃষ্ঠায় ফিরিয়ে নেওয়া উচিত যেখানে তিনি লগইন লিঙ্কটি প্রথম স্থানে ক্লিক করেছিলেন। আমি অনুমান করছি যে আমাকে লগইন ফর্মটি পরিচালনা করে এমন দৃশ্যে বর্তমান পৃষ্ঠার ইউআরএল কোনওভাবেই পাস করতে হবে তবে আমি সত্যিই এটি কাজ করতে পারি না।

সম্পাদনা: আমি এটি সন্ধান। আমি বর্তমান পৃষ্ঠাটি জিইটি প্যারামিটার হিসাবে পাস করে লগইন ফর্মের সাথে লিঙ্ক করেছি এবং তারপরে সেই পৃষ্ঠায় পুনঃনির্দেশের জন্য 'পরবর্তী' ব্যবহার করেছি। ধন্যবাদ!

সম্পাদনা 2: আমার ব্যাখ্যাটি স্পষ্ট বলে মনে হয় নি তাই অনুরোধ করা হ'ল আমার কোডটি: আসুন আমরা বলি যে আমরা একটি পৃষ্ঠায় foo.html রয়েছি এবং আমরা লগ ইন নেই Now এখন আমরা foo.html এর সাথে একটি লিঙ্ক রাখতে চাই যে লিঙ্কগুলি লগইন। 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())

এবং লগইন। Html এর গুরুত্বপূর্ণ লাইন:

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

সুতরাং হ্যাঁ এটি বেশ কার্যকর, আশা এটি পরিষ্কার করে দেয়।


1
আমি মনে করি জাজানো লগইন স্টাফগুলি আপনার পক্ষে হ্যান্ডেল করে, এটি কি আপনার পক্ষে কাজ করে না?
ডমিনিক রজার 13

উত্তর:


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>

এটি লগইন পৃষ্ঠায় একটি জিইটি যুক্তি যুক্ত করবে যা বর্তমান পৃষ্ঠায় ফিরে আসে।

লগইন টেম্পলেটটি তখন এর মতো সহজ হতে পারে:

নিবন্ধন / 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
@ জোরেলি শীর্ষে যুক্ত করে, আপনি নামযুক্ত ইউআরএল ব্যবহার করতে পারেন এবং <a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>পরিবর্তে করতে পারেন ।
hobbes3

12
কোনও ব্যবহারকারী যদি স্রেফ লগ আউট করার পরে লগ ইন করে তবে আপনাকেও নজর রাখতে হবে। অন্য কথায়, ব্যবহারকারীর লগইনগুলির nextমতো /accounts/logout/এবং এর পরে কিছু হবে, তিনি তাত্ক্ষণিকভাবে লল আউট হয়ে যাবেন এবং লুপটি অবিরত থাকবে।
hobes3

2
আমি দেখতে পেয়েছি যে এটি তখনই কাজ করেছিল যখন আমি জ্যাঙ্গো 1.5 তে লগইন ফর্মটিতে নিম্নলিখিতগুলি যুক্ত করেছি: <ইনপুট টাইপ = "লুকানো" নাম = "পরবর্তী" মান = "{{পরের}}" />
এলিস পারসিভাল

28

এটি "সেরা অনুশীলন" নাও হতে পারে তবে আমি এটির আগে সফলভাবে এটি ব্যবহার করেছি:

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

10
এটির একটি দুর্বল বিন্দু রয়েছে - কিছু ব্যবহারকারী / ব্রাউজার রেফারিং পাস করে চলেছে
টমাসজ জিলিস্কি

4
ক্ষেত্রে কোনও সমস্যা রয়েছে যেখানে ব্যবহারকারী কোনও ফর্ম উপস্থিত হন, তথ্য পূরণ করে এবং পরে জমা দেন। তারপরে HTTP_REFERER হ'ল ফর্ম পৃষ্ঠার ইউআরএল, এবং ব্যবহারকারী যে পৃষ্ঠার ইউআরএল প্রথম স্থান থেকে এসেছিল তার URL নয়।
লন্ড্রোম্যাট

25

আপনার প্রয়োজন প্যারাম / মান সহ পূর্ণ ইউআরএল সমর্থন করতে:

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

ন্যায়বিচারের পরিবর্তে:

?next={{ request.path }}

আসলে এটি খুব ভাল ধারণা নয়, খুব বেশি ক্লিক থাকলে আপনি খুব দীর্ঘ ক্যোয়ারী স্ট্রিংটি খুঁজে পাবেন
dspjm

14

জ্যাঙ্গোর অন্তর্নির্মিত প্রমাণীকরণটি আপনার পছন্দ মতো কাজ করে।

তাদের লগইন পৃষ্ঠাগুলিতে একটি nextকোয়েরি স্ট্রিং অন্তর্ভুক্ত যা লগইনের পরে ফিরে আসার পৃষ্ঠা।

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required


4
ঠিক আছে, লগইন_আচ্ছাদিত সাজসজ্জারটি ঠিকঠাক কাজ করবে যেমন এটি আমার যে পৃষ্ঠা থেকে আসে তার 'পরবর্তী' সেট করে, তবে ডিকোরিটার ব্যবহার করার সময় বেনাম ব্যবহারকারীরা সাইটটি দেখতে পাচ্ছেন না কারণ তারা সরাসরি লগইন ফর্মটিতে পুনঃনির্দেশিত হবে। আমি মনে করি যে ব্যবহারকারীটি যে পৃষ্ঠা থেকে আসে তার ইউআরএলটিতে 'পরবর্তী' এর মান কীভাবে সেট করতে হয় সে সম্পর্কে আমাকে কেবল নির্ধারণ করা দরকার।
jörg

1

আমি বর্তমান পৃষ্ঠাটি জিইটি প্যারামিটার হিসাবে পাস করে লগইন ফর্মের সাথে লিঙ্ক করেছি এবং তারপরে সেই পৃষ্ঠায় পুনঃনির্দেশের জন্য 'পরবর্তী' ব্যবহার করেছি। ধন্যবাদ!


1

আমিও একই সমস্যার মুখোমুখি হয়েছি। এই সমাধানটি আমাকে জেনেরিক লগইন দর্শনটি ব্যবহারের অনুমতি দেয়:

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

1

ইন registration/login.html( templatesফোল্ডারের মধ্যে নেস্টেড ) আপনি নিম্নলিখিত লাইনটি সন্নিবেশ করালে পৃষ্ঠাটি জ্যাঙ্গোর মূল অ্যাডমিন লগইন পৃষ্ঠার মতো রেন্ডার হবে:

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

দ্রষ্টব্য: ফাইলটিতে কেবল উপরের রেখা থাকা উচিত।


-1

ভিউজ.লগিন () এর জন্য জাঙ্গো ডক্স দেখুন , আপনি সফল লগইনের পরে পুনর্নির্দেশের জন্য ইনপুট ফর্মটিতে একটি 'পরবর্তী' মান (একটি লুকানো ক্ষেত্র হিসাবে) সরবরাহ করেন।


হ্যাঁ তবে আমি যে পৃষ্ঠা থেকে এসেছি সেখানে কীভাবে আমি 'পরবর্তী' সেট করব?
জের্গ

-3

আপনি এটি করতে পারেন

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

ভুল উত্তর, তবে নাম = 'পরের' সম্ভবত প্রয়োগযোগ্য, পরীক্ষিত নয়।
ওয়েজহংতু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.