https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse
en su urls.py
definir esto:
url(r'^foo$', some_view, name='url_name'),
en una plantilla que se puede hacer referencia a esta URL como:
<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>
<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>
este será mostrado como
<a href="/foo/">link which calls some_view</a>
ahora diga que desea hacer algo similar en su views.py
- por ejemplo, usted está manejando alguna otra URL (no /foo/
) en algún otro punto de vista (no some_view
) y desea redirigir al usuario a /foo/
(a menudo el caso en el envío del formulario éxito)
usted podría hacer
return HttpResponseRedirect('/foo/')
pero, ¿qué sucede si desea cambiar la URL en el futuro? Debería actualizar su urls.py
y todas las referencias en su código. Esto viola DRY (google it).
lugar se puede decir
from django.core.urlresolvers import reverse
return HttpResponseRedirect(reverse('url_name'))
Esto se ve a través de todas las URL definidas en el proyecto para la url definida con el nombre url_name
y devuelve la URL real /foo/
.
esto significa que se refiere a la url solo por su atributo name
- si quiere cambiar la url misma o la vista a la que se refiere, puede hacerlo editando un solo lugar - urls.py
. Esta idea de editar un solo lugar se denomina "No repetir" y es algo por lo que debemos esforzarnos.
Dado un patrón de URL, Django usa url() para recoger la opinión de la derecha y generar una página. Es decir, 'url -> ver nombre'. Pero a veces, como al redirigir, necesitas ir en la dirección opuesta y darle a Django el nombre de una vista, y Django genera la url apropiada. En otras palabras, 'ver nombre -> url'. Es decir, 'reverse()' (es el reverso de la función url). Puede parecer más transparente simplemente llamarlo 'generateUrlFromViewName' pero es demasiado largo y probablemente no lo suficientemente general: https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls – neuronet
@neuronet Gran explicación, gracias. Este nombre parecía (y parece) particularmente no intuitivo para mí, lo que considero un grave pecado. ¿Quién no odia la ofuscación innecesaria? –