2010-08-26 12 views
24

considero que incluyen espacios de nombres de aplicaciones reutilizables:Cómo hacer búsqueda URL inversa en aplicación reutilizable Django namespaced

urlpatterns = patterns('', 
    # ella urls 
    url('^ella/', include('ella.core.urls', namespace="ella")), 
) 

Ahora, las aplicaciones Ella tiene las direcciones URL así:

urlpatterns = patterns('', 
    url(r'^(?P<category>[a-z0-9-/]+)/$', category_detail, name="category_detail"), 
    # object detail 
    url(r'^(?P<category>[a-z0-9-/]+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<content_type>[a-z0-9-]+)/(?P<slug>[a-z0-9-]+)/$', 
     object_detail, name="object_detail") 
) 

Ahora, llamando {% url ella:category_detail category="cat" %} funciona bien. Sin embargo, cuando el objeto intenta generar un enlace a ella de detalles, llama

from django.core.urlresolvers import reverse 
url = reverse('object_detail', kwargs={'required' : 'params'}) 

esto no funciona, a no ser reescrito como

from django.core.urlresolvers import reverse 
url = reverse('ella:object_detail', kwargs={'required' : 'params'}) 

lo tanto, si he entendido bien, incluyendo la aplicación reutilizable en espacio de nombres rompe todos los reversos internos() dentro de la aplicación dada.

¿Es verdad? ¿Qué me he perdido? ¿Hay alguna forma de evitarlo?

+0

+1 Estaba a punto de hacer la misma pregunta –

Respuesta

6

Dado que tiene la configuración de url espaciada por nombre, debe mencionar el espacio de nombres: el patrón de nombre de vista para invertirlo correctamente (especialmente desde la vista).

Pero, si desea evitar esto, también puede pasar espacio de nombre/nombre de aplicación como parámetro current_app. Existen varias formas de especificar current_app cuando se encuentra en la plantilla. Pero si está en la vista, es necesario codificar como lo hizo, o diríjase a parámetros CURRENT_APP

url = reverse('object_detail', 
       kwargs={'foo':'bar'}, 
       current_app=app_name_or_name_space) 

se refieren: http://docs.djangoproject.com/en/dev/topics/http/urls/#reverse

+6

Creo que la verdadera pregunta es: ¿hay alguna manera de incluir una aplicación reutilizable de terceros con un espacio de nombres de URL y no es necesario volver a escribir todas las llamadas a la función inversa() dentro de la aplicación reutilizable. – moberley

+0

Sí, exactamente. current_app es el mismo hardcode que el prefijo: ... pero gracias por el truco. – Almad

+1

de acuerdo. Pero, ¿cómo obtener el nombre de la aplicación actual? ¿Existe tal cosa, de lo contrario, cómo funcionan realmente las aplicaciones conectables? –

0

espacios de nombres de URL se pueden especificar de dos maneras.

En primer lugar, puede proporcionar el espacio de nombres de la aplicación y la instancia como argumentos para incluir() cuando construya sus patrones de URL. Por ejemplo ,:

(r '^ ayuda /', include ('apps.help.urls', espacio de nombres = 'foo', 'bar' APP_NAME =)),

Esta es la derecha desde http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces.

Intente cambiar include('ella.core.urls', namespace="ella") por include('ella.core.urls', namespace="ella", app_name="ella"). No estoy al 100%. Esto funcionará, pero vale la pena intentarlo.

0

Al menos en Django 1.8 se puede escribir algo como esto:

url = reverse('%s:object_detail' % request.resolver_match.namespace, kwargs={'required' : 'params'})

request.resolver_match.namespace es una cadena que contiene el espacio de nombres de la vista actualmente en ejecución.

Cuestiones relacionadas