python - template - httpresponse django example
Comprender django.shortcuts.redirect (1)
¿Por qué el reverso 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''
, consulte su archivo monitor.urls
). Esto significa que Django llamará a la 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.
Según la documentación , debe poder invertir la URL utilizando:
redirect("abc", id=...)
donde ...
es el valor del parámetro id
.
¿Y cómo sabe el reverso que la redirección debe incluir monitor / también?
Eso es porque sabe qué URL están disponibles y 1) sabe dónde se define la vista llamada abc
y 2) sabe que monitors.urls
se incluye con monitor/
en el 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, debe usar espacios de nombres .
Tengo un par de problemas para entender cómo funciona la redirect
o más bien el reverse
.
En el 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<id>.*$)'', ''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é falló el reverse
con abc
pero no con abc/
? ¿Y cómo sabe el reverse
que la redirección debe incluir monitor/
también? ¿Qué pasa si tengo en la urls.py principal otra aplicación llamada xyz
que también tiene una vista abc
?