2009-03-18 15 views
13

Załóżmy, że mam URLconf jak poniżej, a 'foo' i 'bar' są poprawnymi wartościami dla page_slug.Cofanie adresów URL Django dodatkowymi opcjami

urlpatterns = patterns('', 
    (r'^page/(?P<page_slug>.*)/', 'myapp.views.someview'), 
) 

Następnie mógłbym zrekonstruować adresy URL za pomocą poniższego, prawda?

>>> from django.core.urlresolvers import reverse 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) 
'/page/foo/' 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) 
'/page/bar/' 

Ale co, jeśli zmienię mój URLconf na ten?

urlpatterns = patterns('', 
    (r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}), 
    (r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}), 
) 

I Oczekuje się, że wyniki:

>>> from django.core.urlresolvers import reverse 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) 
'/foo-direct/' 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) 
'/my-bar-page/' 

Jednak ta generuje NoReverseMatch wyjątku. Podejrzewam, że próbuję zrobić coś niemożliwego. Wszelkie sugestie na temat dokładniejszego sposobu osiągnięcia tego, czego chcę?

Nazwane adresy URL nie są opcją, ponieważ nie chcę, aby inne aplikacje, które je zawierają, musiały znać specyfikację struktury adresów URL (enkapsulacja i wszystko inne).

+0

Co masz na myśli mówiąc "nie działa"? Komunikat o błędzie? Jeśli tak to co? –

+0

Zgłasza wyjątek 'NoReverseMatch'. –

+0

Zaktualizuj pytanie nowymi faktami - nie dodawaj użytecznych informacji jako komentarzy. –

Odpowiedz

7

Oto, co robimy.

urls.py ma wzorców jak to

url(r'^(?P<datarealm>.*?)/json/someClass/(?P<object_id>.*?)/$', 'json_someClass_resource',), 

views.py jak nazywa reverse like this

object = SomeModel.objects.get(...) 
    url= reverse('json_someClass_resource', kwargs={'object_id':object.id,'datarealm':object.datarealm.name}) 
+0

Nie sądzę, że pomaga to w problemie kolizji nazwy. –

+0

Pierwotnie przegrałem z powodu tego, co powiedział David, ale wygląda na to, że rzeczywiście odpowiadasz na pytanie Justina. Nadal uważam, że odpowiedź Dawida jest "lepsza", ale twoja jest możliwa. – Tyson

+0

Może nie rozumiem, jak to się do powyższego zastosowało przy pierwszym czytaniu. Myślę, że wygląda na to, że może działać ... ale tylko kosztem umieszczenia odniesienia do nazwy adresu URL na poziomie modelu. Jeśli object_1.datarealm.name = 'foo-direct' to zadziała, jeśli object_1.datarealm.name = 'foo', to nie będzie. –

4

nazwanych adresów URL powinna być opcja. Twój przypadek jest zaznaczony w odniesieniu Django:

http://docs.djangoproject.com/en/dev/topics/http/urls/?from=olddocs#id2

Nie jestem pewien, projektanci lewo inną pracę wokół; oczekiwali nazwanych adresów URL, aby to uwzględnić.

Czy mogę odmienić temat enkapsulacji? Dzięki. Istnieją dwa główne powody:

  1. Abstraction - nikt chce aby zobaczyć szczegóły
  2. Bezpieczeństwo - nikt powinny zobaczyć szczegóły

Jak dla 1, można uzyskaj przyzwoitą ilość kilometrów w pythonie, a Django jest doskonałym przykładem. Jeśli chodzi o 2, jest to język interpretowany. Albo uruchamiasz go tam, gdzie jest napisane, albo wysyłasz skompilowane pliki .pyc. Jeśli tak naprawdę to robisz, skompiluj konfigurację adresu URL.

Wreszcie wydaje się być mniej zamkniętą, aby inne aplikacje mogły wiedzieć o funkcjach niż struktura adresów URL. Ale jeśli naprawdę się nie zgadzasz, myślę, że sam musisz wprowadzić bardziej elastyczną metodę odwrotną.

+0

Uzgodnione; eksportowanie nazwanych adresów URL jako interfejsu API jest tak samo "enkapsulowane", jak eksportowanie nazw funkcji widoku. –

+1

# 2 - Bezpieczeństwo przez zapomnienie? :( – monokrome

+0

Myślę, że link jest nieaktualny. W jakiej sekcji chciałbyś zamieścić link? –

19

Powinieneś spróbować nazywać swoje urlconfs. Przykład:

urlpatterns = patterns('', 
    url(r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}, name='foo-direct'), 
    url(r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}, name='bar-page'), 
) 

Po prostu edytuj swoje rewersy i powinieneś zacząć działać.

>>> from django.core.urlresolvers import reverse 
>>> reverse('foo-direct', kwargs={'page_slug': 'foo'}) 
'/foo-direct/' 
>>> reverse('bar-page', kwargs={'page_slug': 'bar'}) 
'/my-bar-page/' 

Więcej informacji na: Django Docs

+0

Jak dokładnie to pomaga z adresem URL, jak w pytaniu: (r '^ page/(? P . *)/"," myapp.views.someview "),? – Rexford

Powiązane problemy