He estado trabajando con Django desde hace un tiempo (actualmente en la versión 1.2), pero recientemente comencé a trabajar en una aplicación que necesita admitir varias instancias. Por ejemplo, el archivo de proyecto urls.py
incluirá dos veces, en dos espacios de nombres diferentes, así:Invertir URL con espacios de nombres en Django: varias instancias de la misma aplicación
urlpatterns = patterns('',
(r'^instance1/', include('myapp.urls', namespace='instance1')),
(r'^instance2/', include('myapp.urls', namespace='instance2')),
)
que iba a lo largo de bien, hasta que me di cuenta que tenía que averiguar qué hacer con todas las llamadas internas a reverse()
(o la plantilla llama al filtro {% url %}
). Por ejemplo, digamos que estoy haciendo algo como lo siguiente en uno de mis puntos de vista:
return HttpResponseRedirect(reverse('view_name'))
o algo así en una de mis plantillas:
<a href="{% url view_name %}">link text</a>
... view_name
donde es el nombre de un patrón de URL contenido en myapp.urls
. Dado que estoy usando espacios de nombres, esto generará un error: no hay una vista llamada view_name
. Por el contrario, tengo que decir instance1:view_name
o instance2:view_name
. Pero hacer esto dinámicamente me está golpeando.
he hecho un poco mirando y parece que el argumento current_app
, se pasa a cualquiera Context
o RequestContext
, fue diseñado para ayudar con esto, pero no está claro en absoluto cómo pasar de forma dinámica el nombre de la aplicación derecho a current_app
. Entonces, ¿cuál es la forma correcta de decirle a Django qué espacio de nombres usar?
EDITAR: Mi caso de uso es utilizar una única instalación de la aplicación varias veces. Es decir, solo existe en el disco una vez, pero se incluye varias veces en la raíz del proyecto urls.py
(cada vez bajo un espacio de nombres diferente, como en mi ejemplo anterior). Teniendo esto en cuenta, ¿hay alguna forma de hacer un seguimiento del espacio de nombres desde el que se llama a una vista/plantilla, y hacer uso de reverse()
o {% url %}
dentro del mismo espacio de nombres? Sé que Django 1.3 proporcionará algunas características adicionales que podrían ayudar con esto (es decir, el new and improved resolve()
), pero seguramente hay una buena manera de hacer esto ahora ...
Mi respuesta a http://stackoverflow.com/questions/2030225/how-to-get-current-app-for-using-with-reverse-in-multi-deployable-reusable-djang/13249060#13249060 se aplica aquí también. – stefanfoulis