Django y urls.py: ¿Cómo hago HttpResponseRedirect a través de una url nombrada?
-
05-07-2019 - |
Pregunta
Estoy escribiendo una aplicación web para miembros, y necesito poder redirigir la página después de iniciar sesión. Quiero usar la url nombrada de mi script urls.py en mi archivo views.py para la aplicación de inicio de sesión, pero no puedo, por mi vida, averiguar qué hacer. Lo que tengo es esto:
def login(request):
if request.session.has_key('user'):
if request.session['user'] is not None:
return HttpResponseRedirect('/path/to/page.html')
Lo que quiero lograr es algo como:
def login(request):
if request.session.has_key('user'):
if request.session['user'] is not None:
return HttpResponseRedirect url pageName
Recibo errores de sintaxis cuando ejecuto esto, ¿alguna idea?
Solución
Debe usar < código> reverse () función de utils.
from django.urls import reverse
# or Django < 2.0 : from django.core.urlresolvers import reverse
def myview(request):
return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
Donde args
satisface todos los argumentos en la expresión regular de su url. También puede proporcionar argumentos con nombre pasando un diccionario.
Otros consejos
La respuesta correcta de Django 1.3 en adelante , donde el método de redirección realiza una llamada inversa implícitamente, es:
from django.shortcuts import redirect
def login(request):
if request.session.get('user'):
return redirect('named_url')
Una forma más concisa de escribir eso si la declaración sería si request.session.get ('usuario')
. has_key está en desuso hoy en día, y .get () devuelve Ninguno (de forma predeterminada, se puede cambiar al pasar un segundo parámetro).
Así que combinando esto con la respuesta de Soviut:
from django.core.urlresolvers import reverse
def login(request):
if request.session.get('user'):
return HttpResponseRedirect(reverse('my-named-url'))
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
def login(request):
if request.session.get('user'):
return redirect(reverse('name-of-url'))
También vea https: // docs .djangoproject.com / es / dev / topics / http / urls / # reverse-resolution-of-urls