Django: Giriş yaptıktan sonra önceki sayfaya yönlendir


175

SO burada bir çok benzer giriş işlevselliği ile basit bir web sitesi inşa etmeye çalışıyorum. Kullanıcı siteye anonim bir kullanıcı olarak göz atabilmelidir ve her sayfada bir giriş bağlantısı olacaktır. Giriş linkine tıklandığında kullanıcı giriş formuna yönlendirilir. Başarılı bir giriş yaptıktan sonra kullanıcı, giriş bağlantısını ilk tıkladığı yerden geri götürmelidir. Bir şekilde mevcut sayfanın URL'sini giriş formunu işleyen görünüme geçirmek zorunda olduğumu tahmin ediyorum ama gerçekten işe yarayamıyorum.

EDIT: Anladım. Geçerli sayfayı bir GET parametresi olarak geçirerek giriş formuna bağlandım ve sonra o sayfaya yönlendirmek için 'sonraki' seçeneğini kullandım. Teşekkürler!

DÜZENLEME 2: Benim açıklama açık değildi bu yüzden burada istendiği gibi benim kodum: Bir sayfa foo.html olduğumuzu ve giriş yapmadık diyelim. Şimdi foo.html bir bağlantı var istiyorum login.html adresine gidin. Orada giriş yapabiliriz ve daha sonra foo.html'ye yönlendiriliriz. Foo.html'deki bağlantı şöyle görünür:

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

Şimdi şöyle görünüyor özel bir giriş görünümü yazdı:

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())

Ve login.html dosyasındaki önemli satır:

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

Evet, bu hemen hemen bu, umarım bunu açıklığa kavuşturur.


1
Bence Django girişleri sizin için işliyor, sizin için çalışmıyor mu?
Dominic Rodger

Yanıtlar:


151

Bunun için ekstra bir görünüm yapmanıza gerek yoktur, işlev zaten yerleşiktir.

İlk olarak bir giriş bağlantısı olan her sayfanın geçerli yolu bilmesi gerekir ve en kolay yol, istek bağlam preprosesörünü settings.py'ye (ilk önce 4'ü varsayılan) eklemektir, daha sonra istek nesnesi her istekte kullanılabilir olacaktır:

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

Ardından Giriş bağlantısını istediğiniz şablonu ekleyin:

base.html:

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

Bu, giriş sayfasına geçerli sayfayı gösteren bir GET argümanı ekler.

Giriş şablonu daha sonra bu kadar basit olabilir:

kayıt / login.html:

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

47
Ben şahsen bu çözümü kullanıyorum, ancak yapacağım bir değişiklik request.pathnull olursa başarısız olması , bu yüzden {% firstof request.path '/' %}, bu şekilde istek yolu kullanıcı ana sayfaya gönderilirse kullanılabilir değilse.
jorelli

1
Çözümünüzü uygulamaya çalışıyorum ama django.contrib.auth.views.login yönlendirmeleri (başarıyla doğruladıktan sonra) kullanıcı örneği istekte değil, bu yüzden user.is_authenticated () her zaman False döndürür. Herhangi bir yardım?
juankysmith

3
@Jorelli'nin üstüne ekleyerek, adlandırılmış URL'yi kullanabilir ve <a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>bunun yerine yapabilirsiniz.
Ocak 2012

12
Ayrıca, bir kullanıcının yalnızca çıkış yaptıktan sonra oturum açıp açmadığını da kontrol etmelisiniz. Başka bir deyişle, kullanıcı girişleri nextgibi bir şey olurdu /accounts/logout/ve hemen lol oturumunu kapatır ve döngü devam eder.
Ocak 2012

2
Bunun yalnızca Django 1.5'teki giriş formuna aşağıdakileri eklediğimde işe yaradığını gördüm: <input type = "hidden" name = "next" value = "{{next}}" />
Ellis Percival

28

Bu bir "en iyi uygulama" olmayabilir, ancak bunu daha önce başarıyla kullandım:

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

10
Bunun zayıf bir noktası var - bazı kullanıcılar / tarayıcılar geçen referansı kapattı
Tomasz Zieliński

4
Bir kullanıcının bir forma ulaşması, bilgileri doldurması ve daha sonra göndermesi durumunda da sorun vardır. HTTP_REFERER bu durumda form sayfasının URL'sidir, kullanıcının ilk etapta geldiği sayfanın URL'si değildir.
LaundroMat

25

İhtiyacınız olan parametre / değerlerle tam URL'leri desteklemek için:

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

yerine:

?next={{ request.path }}

Aslında bu iyi bir fikir değil, çok fazla tıklama varsa sorgu dizesini çok uzun bulacaksınız
dspjm

14

Django'nun yerleşik kimlik doğrulaması istediğiniz gibi çalışır.

Giriş sayfalarında, nextgiriş yaptıktan sonra döndürülecek olan bir sorgu dizesi bulunur.

Http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required adresine bakın


4
Eh, login_required dekoratör, gelen herhangi bir sayfaya 'sonraki' ayarladığından iyi çalışır, ancak anonim dekoratör kullanırken siteyi görüntüleyemezler çünkü hemen giriş formuna yönlendirilirler. Ben sadece kullanıcının geldiği sayfanın url 'yanındaki' değerini ayarlamak için nasıl anlamaya ihtiyacım var.
jörg

1

Geçerli sayfayı bir GET parametresi olarak geçirerek giriş formuna bağlandım ve sonra o sayfaya yönlendirmek için 'sonraki' seçeneğini kullandım. Teşekkürler!


1

Aynı sorunla karşılaştım. Bu çözüm genel giriş görünümünü kullanmaya devam etmeme izin veriyor:

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

1

In registration/login.html(içinde yuvalanmış templatesaşağıdaki satırı eklerseniz, sayfa Django'nın orijinal yönetici giriş sayfası gibi verecek klasöre):

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

Not: Dosya yalnızca yukarıdaki satırları içermelidir.


-1

Views.login () için django belgelerine bakın , başarılı bir giriş yaptıktan sonra yönlendirmek için giriş formunda 'sonraki' bir değer (gizli alan olarak ) sağlarsınız .


Evet, ancak geldiğim sayfanın gerçekte nasıl 'yanında' ayarlayabilirim?
jörg

-3

Bunu da yapabilirsiniz

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

Yanlış cevap, ancak name = 'next' uygulanabilir görünüyor, test edilmedi.
WeizhongTu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.