2011-09-02 41 views
6

Estoy creando un proyecto django. Sin embargo, me he encontrado con un pequeño inconveniente. Mi urls.py se parece a estoDjango redirigir a la raíz desde una vista

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

Mi views.py en la aplicación principal es la siguiente:

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('/') 

Ahora, cuando voy a la página de inicio de sesión, se abre como se esperaba. Después de enviar el formulario, aparece un error que dice que no puede encontrar las URL del módulo. Después de excavar un poco, me di cuenta de que la redirección ("/") en realidad se traduce en http://localhost/login/ en lugar de http://localhost/. Lo mismo ocurre al cerrar la sesión, es decir, intenta abrir la url http://localhost/logout/ en lugar de http://localhost/. Básicamente, cuando la página se abre es http://localhost/login, el redirect('/') agrega el/al final de la url actual, y listo - Recibo una url que no esperaba - http://localhost/login/. No puedo hacer que redirija a la raíz del sitio utilizando el redireccionamiento.

por favor me ayude con esto y si es posible también explicar la causa de este comportamiento irracional de Django

+1

¿Usted intentó HttpResponseRedirect? de importación django.http HttpResponseRedirect def cierre de sesión (petición): \t retorno HttpResponseRedirect ("/") –

+0

dónde está el resto de su urls.py? ¿Qué vista corresponde a "/"? – jterrace

Respuesta

3

Si nos fijamos en la documentation for redirect, hay varias cosas que se pueden pasar a la función:

  • un nombre de modelo
  • Una vista
  • Una URL

En general, creo que es mejor redirigir a un nombre de vista en lugar de a una URL. En su caso, asumiendo que su urls.py tiene una entrada que se ve algo como:

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

lugar me gustaría utilizar redirigir la siguiente manera:

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

jterrace tiene razón, ya que está usando 'url()' puede 'nombrar' it' url (r '^ $', 'Home.views.index', name = "home_index") 'y usarlo en la vista como 'return HttpResponseRedirect (reverse ('home_index'))' también lo usa en la plantilla con 'home' – Pannu

Cuestiones relacionadas