2010-08-09 13 views
25

Próbuję przekierować użytkowników do niestandardowego adresu URL "/ gallery/(nazwa użytkownika) /" po pomyślnym zalogowaniu. Aktualnie przekierowuje do domyślnego "/ account/profile/"Chociaż wiem, co mogę zmienić w adresie przekierowania w moim settings.py, mój adres URL jest dynamiczny, więc nie będzie działać.Parametr "następny", przekierowanie, django.contrib.auth.login

Dokumentacja stwierdza, że ​​muszę użyć "następnego" parametru i procesorów kontekstowych. Mam {{next}} w moim szablonie, ale jestem zdezorientowany, jak właściwie przekazać "/ gallery/(nazwa użytkownika)". Każda pomoc będzie bardzo ceniona.

p.s Próbuję odejść od pisania własnego widoku logowania.

Odpowiedz

18

Przyznaję, że zwykle używam 2 przekierowań, aby coś takiego działało.

Po pierwsze, stwórz własną stronę registration/login.html. Możesz skopiować i wkleić przykład html w tej sekcji authentication docs, aby ułatwić proces. Zamiast korzystać z dynamicznego '{{ next }} zmienną z kontekstu, jednak przewodowego wartość obok, aby przejść do ogólnego widoku docelowej zalogowanych

<input type="submit" value="login" /> 
<input type="hidden" name="next" value="/gallery/" /> 

Następnie w widoku, które mapę do /gallery/ URL wyodrębnić obiekt użytkownika z żądania (ponieważ użytkownik będzie teraz zalogowany, szczególnie jeśli widok galeria jest owinięta w @permission_required lub @login_required dekoratora Użyj tego widoku przekierowanie do odpowiedniego użytkownika specyficzne stronie galerii.

@login_required 
def gallery(request): 
    url = '/gallery/%s/' % request.user.username 
    return HttpResponseRedirect(url) 
+0

Powiedziałbym, że jest to jedno 'przekierowanie' nie dwa, które działa w widoku galerii. Miły. – Timo

0

utwórz własny widok do zalogowania się, korzystając z własnego adresu URL, nie używaj adresu administratora. możesz zapisać następną stronę w sesji lub przekazać ją jako parametr GET do widoku logowania (tj./Login? Next = galeria), ale nie zapomnij o oczyszczeniu i sprawdzeniu tej wartości przed przekierowaniem do niej.

+0

Naprawdę nie chcę tworzyć niestandardowego widoku logowania, ale nawet jeśli zrobiłem to, przykład nie pokazuje, jak przekazać nazwę użytkownika. W jaki sposób "/ login? Next = gallery" ma automatycznie przekierować do/gallery/username. Również gdzie mam umieścić "/ login? Next = gallery" w URLconf lub w widoku za pomocą wyrażenia regularnego? –

+0

nazwa użytkownika jest dostępna w danych sesji. część URLconf mapuje "/ login" do widoku. galeria? next = będzie dostępna w twoim widoku w request.GET ['next'] – ozk

5

Jeśli masz już niestandardowy szablon formularza logowania trzeba dodać następujące wewnątrz tagu <form>:

<input type="hidden" name="next" value="{{next}}" /> 

BTW, nie musisz stworzyć swój własny pogląd logowania. django.contrib.auth.views.login działa poprawnie. Trzeba tylko utworzyć dla niego szablon (registration/login.html)

+1

To jest dokładnie to, jak mam to ustawione, ale gdzie dokładnie przypisuję wartość "next". I jak określić wartość dynamiczną dla "następnego". –

+0

Widzę teraz, że chcesz mieć nazwę użytkownika w {{next}} i nie znasz jej przed przesłaniem formularza. W takim przypadku musisz utworzyć własny widok logowania. Inną opcją jest użycie niewielkiej ilości kodu Javascript, aby wypełnić pole "obok" tuż przed przesłaniem formularza. –

+0

Człowieku, nie pytaj o co. – Denis

2

Możesz użyć statycznego przekierowania do /loggedin/, a następnie powiązać adres URL z widokiem, który tworzy poprawne przekierowanie.

Logowanie robi dodatkowy krok, ale jeśli chcesz użyć widoku django, wykonuje to zadanie.

37

Widok logowania Django django.contrib.auth.views.login accept s słownik o nazwie extra_context. Wartości w słowniku są bezpośrednio przekazywane do szablonu. Możesz użyć tego do ustawienia parametru next. Gdy to zrobisz, możesz ustawić ukryte pole o nazwie next i wartości {{ next }}, aby uzyskać renderowanie w szablonie.

+0

@ django-d To powinno rozwiązać twoje wymagania, tak jak dla mnie. – Guruprasad

+1

Człowieku, ty kołyszesz! Twoja powinna być zaakceptowaną odpowiedzią. Głosować! – Philip007

+0

Próbowałem tego, ale wydawało mi się, że to statycznie ustawi się dalej, bez możliwości przesłonięcia widoku odwołań w razie potrzeby. jednak to znacznie poszerzyło moje zrozumienie tego, jak działa django i może być prostym i bezpośrednim podejściem, dzięki! – antiplex

4

Będąc nowicjuszem w Django i natknąłem się na ten nieco starszy wątek, znalazłem inne rozwiązanie problemu dynamicznego (= przesłonię niestandardowe domyślne tylko w razie potrzeby) ustawiając następny param, który chciałbym udostępnić (działa dobrze z django 1.5, wcześniejsze wersje niesprawdzone):

jak django-d chciałem uniknąć powtórzeń i niestandardowe login widoku, więc użyłem Zdjęcie django.contrib.auth.views.login -widok dodając linię

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

do moich adresów URL .py i wewnątrz login.html-szablonów formularzy element:

{% if not next or not next.strip %} 
    {# avoid django.contrib.auth.views.login s default of /account/profile/ #} 
    {% url 'afterlogindefaultview' as next %} 
{% endif %} 
<input type="hidden" name="next" value="{{ next }}" /> 

który do mojego zrozumienia następuje oddzielenie praktyk z URL konfiguracjach od poglądów. więc do poglądów, które powinny przekierowują do moich aplikacji login i potem udaj się do innego niż domyślny widok używam

return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext'))) 

z widoku gdzie chcę mieć użytkownikowi zalogować. Używam tego wrócić do widoku, w którym został przerwany w celu zalogowania użytkownika.