2009-10-22 21 views
7

Próbuję przekierować użytkownika do adresu URL zawierającego jego nazwę użytkownika (np. http://domain/username/) i spróbować dowiedzieć się, jak to zrobić. Używam django.contrib.auth dla mojego zarządzania użytkownikami, więc próbowałem przy użyciu LOGIN_REDIRECT_URL w ustawieniach:django LOGIN_REDIRECT_URL z wartością dynamiczną

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail.. 

ale wydaje się jedynie do przyjęcia środków struny, a nie coś, że będę po ustalonej użytkownik jest zalogowany. Jak mogę to jeszcze zrobić?

Odpowiedz

17

Rozwiązaniem jest przekierowanie do statycznej trasy, takiej jak "/ userpage /" i przekierowanie do ostatecznej strony dynamicznej.

Ale myślę, że prawdziwym rozwiązaniem jest zrobienie nowego spojrzenia na to, co naprawdę chcesz.

from django.contrib.auth import authenticate, login 
from django.http import HttpResponseRedirect 

def my_view(request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      HttpResponseRedirect('/%s/'%username) 
     else: 
      # Return a 'disabled account' error message 
    else: 
     # Return an 'invalid login' error message. 

http://docs.djangoproject.com/en/dev/topics/auth/#authentication-in-web-requests

Więcej informacji na temat przepisywania pogląd. Tak mówią doktorzy, aby zastąpić tego rodzaju rzeczy.

+2

I wolą t pierwsza sugestia przekierowania ze strony statycznej/user /. W ten sposób nadal możesz używać widoku logowania z 'django.contrib.auth.views', który może być bardziej niezawodny niż widok ręczny. – Alasdair

+0

ponieważ próbuję uprościć adresy URL i zminimalizować przekierowania, Twoje rozwiązanie wydaje się być właściwą drogą. dzięki! – sa125

+0

Co za prosta i błyskotliwa odpowiedź, która rozwiązuje moje dokładne pytanie. Wstydzę się, że o tym nie myślę. ciesz się swoim punktem internetowym. – Esteban

0

Zawiń widok autoryzacji we własnym widoku niestandardowym i przekieruj do dowolnego miejsca, jeśli uwierzytelnienie powiodło się.

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

def login(request): 
    template_response = auth.views.login(request) 

    if isinstance(template_response, HttpResponseRedirect) and template_response.url == '/accounts/profile/': 
     return HttpResponseRedirect(reverse('user', args=(request.user.username,))) 


    return template_response 

Inną alternatywą jest użycie param kwerendy next wskazać gdzie przekierować do po zalogowaniu.

<a href="{% url 'login' %}?next={{ request.path }}">sign in</a> 
0

Z django.contrib.auth.views.LoginView klasy oparte, można teraz po prostu zastąpić get_success_url:

urls.py:

url(r'^login$', MyLoginView.as_view(), name='login'), 
url(r'^users/(?P<username>[a-zA-Z0-9]+)$', MyAccountView.as_view(), name='my_account'), 

views.py

class MyLoginView(LoginView): 

    def get_success_url(self): 
     return reverse('my_account', args=[self.request.user.username]) 
Powiązane problemy