2010-08-26 13 views
24

Betrachten Sie tun, dass ich wieder verwendbare Anwendung Namespace gehören:Wie Reverse-URL Suche in Django Namespaced wieder verwendbare Anwendung

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

Jetzt sind die Ella-Anwendungen, hat Urls wie folgt aus:

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

Nun ruft {% url ella:category_detail category="cat" %} funktioniert gut. Wenn jedoch Objekt versucht, Link, um es um die Details zu erzeugen, ruft es

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

Diese nicht funktioniert, neu geschrieben, es sei denn als

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

Also, wenn ich es richtig verstehe, einschließlich wiederverwendbarer Anwendung in Namespace bricht alle inneren reverse() s innerhalb der gegebenen Anwendung.

Ist es wahr? Was habe ich verpasst? Gibt es einen Weg?

+0

+1 Ich war im Begriff, die gleiche Frage zu stellen –

Antwort

6

Da Sie eine Namens-Abstand-URL-Konfiguration haben, müssen Sie Namespace erwähnen: View-Name-Muster, um es richtig umzukehren (besonders aus Sicht).

Wenn Sie dies jedoch vermeiden möchten, können Sie auch den Namespace/appname als current_app-Parameter übergeben. Es gibt mehrere Möglichkeiten, current_app anzugeben, wenn Sie sich in einer Vorlage befinden. Aber wenn man in Sicht sind, müssen Sie hart Code wie Sie taten, oder passieren zu CURRENT_APP Parameter

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

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

+6

Ich denke, die eigentliche Frage ist: Gibt es eine Möglichkeit, eine wiederverwendbare Anwendung von Drittanbietern mit einem URL-Namespace und nicht alle Aufrufe der reverse() -Funktion neu schreiben innerhalb der wiederverwendbaren App. – moberley

+0

Yup, genau. current_app ist derselbe Hardcode wie das Präfix: ... aber danke für den Trick. – Almad

+1

Einverstanden. Aber, wie bekommt man den aktuellen App-Namen? Gibt es solche, sonst wie wirklich steckbare Apps funktionieren. –

0

URL-Namespaces kann auf zwei Arten angegeben werden.

Erstens können Sie den Anwendungs- und Instanznamespace als Argumente für include() angeben, wenn Sie Ihre URL-Muster erstellen. Zum Beispiel ,:

(r '^ help /', beinhalten ('apps.help.urls', namespace = 'foo', app_name = 'bar')),

Dieses Recht ist aus http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces.

Versuchen Sie, include('ella.core.urls', namespace="ella") zu include('ella.core.urls', namespace="ella", app_name="ella") zu ändern. Ich bin nicht 100% das wird funktionieren, aber es ist einen Versuch wert.

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

request.resolver_match.namespace ist eine Zeichenkette, die den Namensraum des aktuell laufenden Ansicht:

0

Mindestens in Django 1.8 Sie so etwas schreiben kann.