Espacio de nombres para urls en Django (>= 1.0)

written by uve 29 June 2010

La situación es la siguiente, tenemos la aplicación A y la aplicación B que estamos integrando en un mismo proyecto. Cada una tiene su propio urls.py (cuando estás integrando distintos módulos esto se agradece mucho) y dentro de ambas aplicaciones, existe una url con nombre 'foo'. Es decir,

Fichero urls.py de la aplicación A:

...
url (r'^applicationA/foo/$', 'a_foo', name='foo'),
...

Fichero urls.py de la aplicación B:

...
url (r'^applicationB/foo/$', 'b_foo', name='foo'),
...

Ahora en el urls.py de nuestro proyecto hacemos lo siguiente:

...
url (r'^A/$', include=('A.urls')),
url (r'^B/$', include=('B.urls')),
...

¿Qué problema contrae esto? Supongamos que la vista principal renderiza index.html y que contiene lo siguiente:

...
<a href="{% url foo %}">Foo</a>

...

Esto siempre llamará al url de la aplicación B, ya que fue la última en procesarse, quedando oculta la url de la aplicación A. ¿Cómo solucionar esto? Los espacios de nombres.

Django nos permite utilizar los espacios de nombres para este tipo de circunstancias. De hecho, las aplicaciones que Django proveen utilizan este sistema, como por ejemplo la aplicación admin.

...
url (r'^A/$', include=('A.urls', namespace='A')),
url (r'^B/$', include=('B.urls', namespace='B')),
...

Y ahora, podemos hacer la distinción en nuestro index.html de la siguiente forma:

...
<a href="{% url A:foo %}">Foo Application A</a>

<a href="{% url B:foo %}">Foo Application B</a>
...

url (r'^tienda/', include('lemur.tienda.urls')),

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.