2010-08-26 8 views
24

Rozważmy że obejmują przestrzeni nazw wielokrotnego użytku aplikację:Jak zrobić odwrotnego wyszukiwania adresów URL w Django przestrzeni nazw wielokrotnego stosowania

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

Teraz aplikacje Ella ma adresy URL tak:

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

Teraz, nazywając {% url ella:category_detail category="cat" %} działa w porządku. Jednak, gdy obiekt próbuje wygenerować link do niego w szczegółach, wywołuje

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

ten nie działa, chyba że przepisany jako

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

Więc jeśli rozumiem go poprawnie, tym wielokrotnego zastosowania do nazw łamie wszystkie wewnętrzne odwrotne() wewnątrz danej aplikacji.

Czy to prawda? Co przeoczyłem? Czy istnieje jakiś sposób?

+0

+1 Już miałem zadać to samo pytanie –

Odpowiedz

6

Ponieważ masz konfigurację adresu URL z odstępami między nazwami, musisz wspomnieć o przestrzeni nazw: wzorzec nazwy widoku, aby odwrócić go poprawnie (zwłaszcza z widoku).

Ale jeśli chcesz tego uniknąć, możesz także przekazać przestrzeń nazw/appname jako parametr current_app. Istnieje wiele sposobów określania current_app, gdy jesteś w szablonie. Ale jeśli jesteś w związku, trzeba twardym kodu jak ty, albo przejść do parametru current_app

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

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

+6

Myślę, że prawdziwe pytanie brzmi: czy istnieje sposób na umieszczenie aplikacji wielokrotnego użytku innej firmy z przestrzenią nazw URL i nie trzeba przepisywać wszystkich wywołań do funkcji odwrotnej() wewnątrz aplikacji wielokrotnego użytku. – moberley

+0

Tak, dokładnie. current_app to taki sam kod jak przedrostek: ... ale dzięki za lewę. – Almad

+1

Uzgodnione. Ale, jak uzyskać nazwę bieżącej aplikacji? czy jest taki, w przeciwnym razie, jak naprawdę działają aplikacje do podłączania. –

0

URL Przestrzenie nazw można określić na dwa sposoby.

Po pierwsze, można podać obszar nazw aplikacji i instancji jako argumenty do uwzględnienia() podczas konstruowania wzorców adresów URL. Przykładowo ,:

(R '^ pomoc /' obejmują ('apps.help.urls' namespace = 'foo' 'bar' APP_NAME =)),

to jest od prawej http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces.

Spróbuj zmienić include('ella.core.urls', namespace="ella") na include('ella.core.urls', namespace="ella", app_name="ella"). Nie jestem w 100% to zadziała, ale warto spróbować.

0

Przynajmniej w Django 1.8 można napisać coś takiego:

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

request.resolver_match.namespace to ciąg zawierający nazw widoku obecnie uruchomiony.

Powiązane problemy