Entendiendo django.shortcuts.redirect

Tengo un par de problemas para entender cómo funciona realmente la redirect o, más bien, la reverse

En la urls.py principal tengo:

 from django.conf.urls import patterns, include, url from django.views.generic.simple import redirect_to urlpatterns = patterns('', url(r'^$', redirect_to, {'url': '/monitor/'}), url(r'^monitor/', include('monitor.urls')), ) 

y en monitors.urls tengo:

 from django.conf.urls import patterns, include, url urlpatterns = patterns('monitor.views', (r'^$', 'index'), (r'^abc/(?P.*$)', 'abc'), ) 

Cuando llamas /monitor , quiero redirigirlo a /monitor/abc así que lo hice:

 def index(request): return redirect("abc") def abc(render, id=None): return render_to_response("monitor/list.htmld", {}) 

Pero tengo una excepción NoReverseMatch . Pero cuando lo hago:

 def index(request): return redirect("abc/") 

entonces de repente funciona.

No puedo entender completamente por qué. ¿Por qué la reverse falló con abc pero no con abc/ ? ¿Y cómo sabe reverse que la redirección debería incluir monitor/ también? ¿Qué sucede si tengo en la urls.py principal otra aplicación llamada xyz que también tiene una vista abc ?

¿Por qué la reversa falló con ‘abc’ pero no con ‘abc /’?

Debido a que lo interpretó como un nombre de vista (y de hecho tiene una vista llamada 'abc' , vea su archivo monitor.urls ). Esto significa que Django llamará reverse para calcular la URL. El valor abc/ se interpreta como una URL real, lo que significa que Django no llamará a la reverse para determinar la URL.

Esto también explica por qué falló la reverse : la vista con nombre abc también requiere un argumento llamado id . De lo contrario, Django no podrá buscar la URL ya que no hay una vista llamada abc sin parámetros.

En función de la documentación , debería poder revertir la URL utilizando:

 redirect("abc", id=...) 

donde ... es el valor del parámetro id .

¿Y cómo sabe reversa que la redirección debería incluir monitor / también?

Esto se debe a que sabe qué URL están disponibles y 1) sabe dónde está definida la vista llamada abc y 2) sabe que monitors.urls se incluye con monitor/ al frente.

¿Qué sucede si tengo en la urls.py principal otra aplicación llamada “xyz” que también tiene una vista “abc”?

En ese caso tienes que usar espacios de nombres .