2011-02-02 16 views
26

Domyślnie po zalogowaniu django przekierowuje użytkownika na stronę konta/profilu lub jeśli edytujesz LOGIN_REDIRECT_URL, możesz wysłać użytkownika na inną stronę określić w pliku settings.py.Django - po zalogowaniu przekieruj użytkownika na swoją stronę niestandardową -> mysite.com/nazwa_użytkownika

To jest świetne, ale chciałbym, aby użytkownik (po zalogowaniu) został przekierowany na niestandardową stronę, na której link do tej strony wyglądałby tak: mysite.com/username. Więc domyślne ustawienia kont/profilu lub LOGIN_REDIRECT_URL nie zadziałają w tym przypadku, ponieważ oba są w pewien sposób statyczne. W moim przypadku sekcja adresu username zmienia się dla każdego użytkownika.

Wszelkie pomysły, jak mogę to zrobić, aby użytkownik zalogowany był na niestandardowej stronie użytkownika, która ma nazwę użytkownika pod adresem: mysite.com/username? Wszelkie dane wejściowe są naprawdę doceniane.

Odpowiedz

6

Można uwierzytelniania i logowania użytkownika w jak stwierdzono tutaj: http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in

To da Ci dostęp do obiektu użytkownika, z którego można uzyskać nazwę użytkownika, a następnie zrobić HttpResponseRedirect do niestandardowego adresu URL.

+0

Zapomniałem wspomnieć, że używam django.contrib.auth.views dostarczanego z django. Czy w tym przypadku mogę mieć niestandardowy adres URL opisany powyżej? – avatar

+1

Nie jestem pewien, czy można dostosować "auth.views.login" w tym zakresie. Powiedziałbym, że po prostu napiszę własną funkcję logowania, dokładnie taką, jak ta w dokumentacji, którą złączyłem powyżej. –

55

Prostsze podejście polega na przekierowaniu ze strony LOGIN_REDIRECT_URL. Kluczową rzeczą do zrealizowania jest to, że informacje o użytkowniku są automatycznie uwzględniane w żądaniu.

Załóżmy:

LOGIN_REDIRECT_URL = '/profiles/home' 

i skonfigurowaniu URLPATTERN:

(r'^profiles/home', home), 

Następnie wszystko trzeba napisać do widoku home() jest:

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.contrib.auth.decorators import login_required 

@login_required 
def home(request): 
    return HttpResponseRedirect(
       reverse(NAME_OF_PROFILE_VIEW, 
         args=[request.user.username])) 

gdzie NAME_OF_PROFILE_VIEW jest nazwa używanego callbacka. W profilach django NAME_OF_PROFILE_VIEW może być "profiles_profile_detail".

+1

Co zrobić z widokami opartymi na klasach? – User

+0

@Użyj widoku 'home' może przekierować do dowolnego wzorca url, nie ma znaczenia, czy używa widoku opartego na funkcji lub widoku opartego na klasie. – Alasdair

0

Dostałem ostatnio django i szukałem rozwiązania tego problemu i znalazłem metodę, która może być przydatna.

Na przykład, jeśli używasz allouth, domyślnym przekierowaniem są konta/profile. Zrób pogląd, że jedynie przekierowuje do miejsca wyboru przy użyciu pola nazwę użytkownika tak:

def profile(request): 
name=request.user.username 
return redirect('--choose where--/' + name + '/') 

Następnie należy utworzyć widok, który rejestruje go w jednym ze swoich aplikacji, na przykład:

def profile(request, name): 
user = get_object_or_404(User, username=name) 
return render(request, 'myproject/user.html', {'profile': user}) 

Gdzie uchwycenie urlpatterns wyglądałoby następująco:

url(r'^(?P<name>.+)/$', views.profile, name='user') 

Działa dobrze dla mnie.

2

Tak! W swojej settings.py zdefiniować następujące

LOGIN_REDIRECT_URL = '/your-path' 

I mieć „/ twój-path” być prosty pogląd, że patrzy self.request.user i robi cokolwiek logika musi zwrócić HttpResponseRedirect obiekt.

Lepszym sposobem może być zdefiniowanie prostego adresu URL, takiego jak '/simple', który wykonuje tam logikę wyszukiwania. Adres URL wygląda piękniej, oszczędza ci trochę pracy, itp.

-3
return render(request,'page_location/page_name') 

return render(request,'home/page-login.html') 
+3

Czy możesz sformatować swój kod, podświetlając go i naciskając Ctrl + K – WhatsThePoint

Powiązane problemy