2010-08-26 1 views
24

Si consideri che includo namespace applicazione riutilizzabile:Come fare ricerca URL inversa in applicazione riutilizzabile Django namespace

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

Ora, le applicazioni Ella ha gli URL del genere:

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") 
) 

Ora, chiamando {% url ella:category_detail category="cat" %} funziona bene. Tuttavia, quando l'oggetto tenta di generare link ad esso di dettagli, chiama

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

Questo non funziona, a meno che non riscritta come

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

Quindi, se ho capito bene, compresa l'applicazione riutilizzabile nel namespace interrompe tutto il reverse interno() s all'interno dell'applicazione data.

È vero? Cosa mi sono perso? C'è un modo per aggirare?

+0

+1 Stavo per fare la stessa domanda –

risposta

6

Dato che si dispone di una configurazione URL con nome, è necessario menzionare lo spazio dei nomi: schema nome-vista per poterlo invertire correttamente (specialmente dalla vista).

Tuttavia, se si desidera evitare ciò, è possibile passare anche namespace/appname come parametro current_app. Ci sono molti modi per specificare current_app quando ci si trova nel modello. Ma se si è in vista, è necessario codificare come hai fatto, o si passa al parametro CURRENT_APP

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

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

+6

Penso che la vera domanda sia: c'è un modo per includere un'app riusabile di terze parti con uno spazio dei nomi URL e non è necessario riscrivere tutte le chiamate alla funzione inversa() all'interno dell'app riutilizzabile. – moberley

+0

Sì, esattamente. current_app è lo stesso hardcode del prefisso: ... ma grazie per il trucco. – Almad

+1

concordato. Ma come ottenere il nome dell'app attuale? c'è così, altrimenti come funzionano app davvero collegabili. –

0

spazi dei nomi URL possono essere specificati in due modi.

In primo luogo, è possibile fornire l'applicazione e lo spazio dei nomi di istanza come argomenti da includere() quando si costruiscono i modelli di URL. Per esempio ,:

(r '^ aiuto /', include ('apps.help.urls', namespace = 'foo', 'bar' APP_NAME =)),

Questo è giusto da http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces.

Provare a cambiare include('ella.core.urls', namespace="ella") a include('ella.core.urls', namespace="ella", app_name="ella"). Non sono al 100% questo funzionerà, ma ne vale la pena.

0

Almeno in Django 1.8 si può scrivere qualcosa di simile:

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

request.resolver_match.namespace è una stringa che contiene lo spazio dei nomi della vista attualmente in esecuzione.