https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse
nel vostro urls.py
definire questo:
url(r'^foo$', some_view, name='url_name'),
in un modello è possibile fare riferimento a questo URL come:
<!-- 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>
questo sarà reso come
<a href="/foo/">link which calls some_view</a>
ora dì che vuoi fare qualcosa di simile nel tuo views.py
- ad es. si gestisce qualche altro url (non /foo/
) in qualche altro punto di vista (non some_view
) e si desidera reindirizzare l'utente a /foo/
(spesso il caso sul successo invio di un modulo)
si può solo fare
return HttpResponseRedirect('/foo/')
ma se si desidera modificare l'URL in futuro, è necessario aggiornare il proprio urls.py
e tutti i riferimenti ad esso nel codice. Questo viola DRY (google it).
invece si può dire
from django.core.urlresolvers import reverse
return HttpResponseRedirect(reverse('url_name'))
Questo guarda attraverso tutti gli URL definiti nel progetto per l'URL definito con il nome url_name
e restituisce l'URL reale /foo/
.
Ciò significa che si fa riferimento all'url solo tramite l'attributo name
. Se si desidera modificare l'URL stesso o la vista a cui fa riferimento, è possibile farlo modificando un solo posto - urls.py
. L'intera idea di editare un posto solo si riferisce a "Non ripetere te stesso" ed è qualcosa per cui lottare.
Dato un modello di URL, Django utilizza url() per scegliere la giusta visione e generare una pagina. Cioè, 'url -> visualizza nome'. Ma a volte, come quando si sta reindirizzando, è necessario andare nella direzione opposta e dare a Django il nome di una vista, e Django genera l'URL appropriato. In altre parole, 'visualizza nome -> url'. Cioè, 'reverse()' (è il contrario della funzione url). Potrebbe sembrare più trasparente chiamarlo 'generateUrlFromViewName' ma è troppo lungo e probabilmente non abbastanza generale: https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls – neuronet
@neuronet Ottima spiegazione, grazie. Questo nome mi sembrava (e sembra) particolarmente non intuitivo per me, che ritengo sia un peccato grave. Chi non odia l'offuscamento non necessario? –