Espacio de nombres para urls en Django II
Hace un rato he escrito cómo y cuándo activar el espacio de nombres para urls en Django. Ahora voy a comentaros muy brevemente un problemilla y un par de errores con los que me he encontrado (aunque creo que no son muy frecuentes, nunca se sabe).
El hecho de trabajar con espacios de nombres, nos obliga a que las plantillas propias de la aplicación y las vistas utilicen este espacio de nombres cada vez que se quiera hacer un reverse. Esto nos hace perder algo de flexibilidad, ya que siempre hay que utilizar este espacio de nombres. Trataré de buscar alguna forma para que se pueda automatizar esto, aunque no sé si la habrá.
Supongamos que vamos a tratar de integrar la aplicación app, la cuál tiene una url llamada foo. Si en alguna plantilla o vista se utiliza reverse con foo directamente, tendremos un error como el siguiente:
Caught NoReverseMatch while rendering: Reverse for 'foo' with arguments '()' and keyword arguments '{}' not found.
La solución es simple, donde antes ponía:
...
<a href="{% url foo %}">Foo</a>
...
ahora ponemos:
...
<a href="{% url app:foo %}">Foo</a>
...
El otro error que me he encontrado es el siguiente:
Caught NoReverseMatch while rendering: u'app' is not a registered namespace
El error proviene de una línea de una plantilla tal como la que hemos dicho antes:
...
<a href="{% url app:foo %}">Foo</a>
...
Aquí el problema es ligeramente diferente. Todo proviente de que no se ha incluido el espacio de nombres a la hora de definir el url. Comprobar que aparece lo siguiente en el urls.py correspondiente:
...
url (r'^app/', include('app.urls', namespace='app')),
...
De momento esto es todo lo que puedo contaros acerca de los espacios de nombres en Django :)
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é.
