2011-09-02 10 views
6

Tworzę projekt django. Jednak natknąłem się na małą czkawkę. Moje urls.py wygląda następującoPrzekierowanie Django do root'a z widoku

url(r'^login/(?P<nextLoc>)$', 'Home.views.login'), 
url(r'^logout/$', 'Home.views.logout'), 

mój views.py w aplikacji Home jest następujący:

def login(request,nextLoc): 
    if request.method == "POST": 
     form = AuthenticationForm(request.POST) 
     user=auth.authenticate(username=request.POST['username'],password=request.POST['password']) 
     if user is not None: 
      if user.is_active: 
       auth.login(request, user) 
       return redirect(nextLoc) 
      else: 
       error='This account has been disabled by the administrator. Contact the administrator for enabling the said account' 
     else: 
      error='The username/password pair is incorrect. Check your credentials and try again.' 

    else: 
     if request.user.is_authenticated(): 
      return redirect("/profile/") 
     form = AuthenticationForm() 
     error='' 
    return render_to_response('login.html',{'FORM':form,'ERROR':error},context_instance=RequestContext(request)) 

def logout(request): 
    auth.logout(request) 
    return redirect('/') 

Teraz, gdy jadę do strony logowania, to otwiera się zgodnie z oczekiwaniami. Po przesłaniu formularza pojawia się błąd informujący, że nie może znaleźć adresów URL modułów. Po krótkim wykopaniu zauważyłem, że przekierowanie ("/") faktycznie przekłada się na http://localhost/login/ zamiast na http://localhost/. To samo dzieje się podczas wylogowywania, tzn. Próbuje otworzyć adres URL http://localhost/logout/ zamiast http://localhost/. Zasadniczo po otwarciu strony to http://localhost/login, redirect('/') dodaje/na końcu bieżącego adresu URL i voila - otrzymuję URL, którego się nie spodziewałem - http://localhost/login/. Nie mogę zmusić go do przekierowania do katalogu głównego witryny za pomocą przekierowania.

Proszę mi pomóc z tym i jeśli to możliwe także wyjaśnić przyczynę tego irracjonalnego zachowania Django

+1

Próbowałaś HttpResponseRedirect? z importu django.http HttpResponseRedirect def wylogowania (request): \t powrót HttpResponseRedirect ("/") –

+0

gdzie jest reszta twojej urls.py? Jaki widok odpowiada "/"? – jterrace

Odpowiedz

3

Jeśli spojrzeć na documentation for redirect, istnieje kilka rzeczy, które można przekazać do funkcji:

  • Nazwa modelu
  • widok
  • URL

Ogólnie, myślę, że lepiej przekierować do nazwy widoku niż adresu URL. W twoim przypadku, zakładając swój urls.py posiada wpis, który wygląda mniej więcej tak:

url(r'^$', 'Home.views.index'), 

bym zamiast używać przekierować tak:

redirect('Home.views.index') 
+2

jterrace ma rację, ponieważ używasz 'url()' możesz 'name' it' url (r '^ $', 'Home.views.index', name = "home_index") 'i użyć go w widoku jako 'return HttpResponseRedirect (reverse ('home_index'))' również używa go w szablonie z 'home' – Pannu

Powiązane problemy