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 ?