2011-01-16 8 views
5

Rozumiem, jak dynamicznie tworzyć adresy URL w Django na podstawie nazw przechowywanych w obiektach bazy danych. Wszystkie te strony powinny być obsługiwane przez ten sam widok, ale chciałbym, aby obiekt bazy danych został przekazany do widoku jako parametr, gdy zostanie wywołany. Czy to jest możliwe?Django: Przekazywanie danych do wyświetlenia z modułu do przesyłania adresów URL bez uwzględniania danych w adresie URL?

Oto kod Obecnie mam:

places = models.Place.objects.all() 
for place in places: 
    name = place.name.lower() 
    urlpatterns += patterns('', 
     url(r'^'+name +'/$', 'misc.views.home', name='places.'+name) 
    ) 

Czy to możliwe, aby przekazać dodatkowe informacje do widzenia, nie dodając więcej parametrów do adresu URL? Ponieważ adresy URL są dla katalogu głównego i nadal potrzebuję 404 stron do wyświetlenia na innych wartościach, nie mogę po prostu użyć parametru ciągu. Czy rozwiązaniem jest rezygnacja z próby dodania adresów URL do katalogu głównego, czy istnieje inne rozwiązanie?

Przypuszczam, że mógłbym wykonać odnośnik na samej nazwie, ponieważ wszystkie adresy URL muszą i tak być unikalne. Czy to jedyna inna opcja?

Odpowiedz

18

To generalnie zły pomysł, ponieważ wysyła zapytanie do bazy danych o każde żądanie, a nie tylko o wnioski dotyczące tego modelu. Lepszym pomysłem jest wymyślenie ogólnej kompozycji adresu URL i użycie tego samego widoku dla wszystkich z nich. Możesz wtedy pobrać odpowiednie miejsce w widoku, które trafi tylko do bazy danych po osiągnięciu tego widoku.

Na przykład:

urlpatterns += patterns('', 
    url(r'^places/(?P<name>\w+)/$', 'misc.views.home', name='places.view_place') 
) 

# views.py 
def home(request, name): 
    place = models.Place.objects.get(name__iexact=name) 
    # Do more stuff here 

Zdaję sobie sprawę, to nie jest to, czego naprawdę poprosił, ale powinny zapewnić Państwu znacznie mniej bólów głowy.

+0

Podnosisz dobry punkt. Dzięki! –

18

myślę, że można przejść do widoku słownika z additional attributes, tak:

url(r'^'+name +'/$', 'misc.views.home', {'place' : place}, name='places.'+name) 

I można zmienić widok oczekiwać tego parametru.

+0

To o co prosiłem - nie wiedziałem, że tak to się robi. @Cide podniósł dobry punkt, że wymagałoby to zapytania do bazy danych dla każdego żądania, więc idę z jego odpowiedzią. Dzięki! –

+0

Nie ma problemu, cieszę się, że znalazłeś rozwiązanie :) –

Powiązane problemy