Próbuję zbudować prostą stronę internetową z funkcjonalnością logowania bardzo podobną do tej tutaj na SO. Użytkownik powinien mieć możliwość przeglądania witryny jako użytkownik anonimowy, a na każdej stronie będzie znajdował się link do logowania. Po kliknięciu łącza logowania użytkownik zostanie przeniesiony do formularza logowania. Po pomyślnym zalogowaniu użytkownik powinien zostać przeniesiony z powrotem na stronę, z której w pierwszej kolejności kliknął link logowania. Zgaduję, że muszę jakoś przekazać adres URL bieżącej strony do widoku obsługującego formularz logowania, ale tak naprawdę nie mogę go uruchomić.
EDYCJA: Rozgryzłem to. Połączyłem się z formularzem logowania, przekazując bieżącą stronę jako parametr GET, a następnie użyłem „next”, aby przekierować na tę stronę. Dzięki!
EDYCJA 2: Moje wyjaśnienie nie wydawało się jasne, więc zgodnie z żądaniem jest mój kod: Powiedzmy, że jesteśmy na stronie foo.html i nie jesteśmy zalogowani. Teraz chcielibyśmy mieć link na foo.html, który zawiera linki to login.html. Tam możemy się zalogować, a następnie zostajemy przekierowani z powrotem do foo.html. Link na foo.html wygląda następująco:
<a href='/login/?next={{ request.path }}'>Login</a>
Teraz napisałem niestandardowy widok logowania, który wygląda mniej więcej tak:
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())
I ważny wiersz w login.html:
<form method="post" action="./?next={{ redirect_to }}">
Więc tak, to prawie wszystko, mam nadzieję, że to wyjaśnia.
Odpowiedzi:
Nie musisz w tym celu tworzyć dodatkowego widoku, funkcjonalność jest już wbudowana.
Najpierw każda strona z łączem logowania musi znać aktualną ścieżkę, a najłatwiejszym sposobem jest dodanie preprosesora kontekstu żądania do settings.py (pierwsze 4 są domyślne), wtedy obiekt żądania będzie dostępny w każdym żądaniu:
settings.py:
Następnie dodaj szablon, do którego chcesz dodać link do logowania:
base.html:
Spowoduje to dodanie argumentu GET do strony logowania, który wskazuje na bieżącą stronę.
Szablon logowania może być wtedy tak prosty:
rejestracja / login.html:
źródło
request.path
jest zerowe, więc robię to{% firstof request.path '/' %}
w ten sposób, jeśli ścieżka żądania nie jest dostępna z jakiegoś powodu, użytkownik zostanie wysłany na stronę główną.<a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>
zamiast tego zrobić .next
byłoby to coś podobnego/accounts/logout/
i po zalogowaniu się użytkownika zostanie on natychmiast wylogowany z powrotem lol, a pętla będzie kontynuowana.Może to nie jest „najlepsza praktyka”, ale z powodzeniem stosowałem to wcześniej:
źródło
Aby obsługiwać pełne adresy URL z parametrami / wartościami, których potrzebujesz:
zamiast tylko:
źródło
Wbudowane uwierzytelnianie Django działa tak, jak chcesz.
Ich strony logowania zawierają
next
ciąg zapytania, do którego należy powrócić po zalogowaniu.Spójrz na http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required
źródło
Połączyłem się z formularzem logowania, przekazując bieżącą stronę jako parametr GET, a następnie użyłem „next”, aby przekierować na tę stronę. Dzięki!
źródło
Napotkałem ten sam problem. To rozwiązanie pozwala mi nadal używać ogólnego widoku logowania:
źródło
W
registration/login.html
(zagnieżdżone wtemplates
folderze), jeśli wstawisz następujący wiersz, strona będzie wyglądać jak oryginalna strona logowania administratora Django:Uwaga: plik powinien zawierać tylko powyższe wiersze.
źródło
Zobacz dokumentację django dla views.login () , podajesz wartość 'next' (jako ukryte pole) w formularzu wejściowym, do którego ma nastąpić przekierowanie po pomyślnym zalogowaniu.
źródło
Ty też możesz to zrobić
źródło