urls template example python django django-views django-urls

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 ?