2012-02-25 20 views
9

Zajmuję się tworzeniem strony internetowej z wykorzystaniem Django jako zaplecza i chcę umożliwić klientowi dodawanie nowych stron przy użyciu interfejsu administratora - tak, że wpisuje tytuł strony, alias strony, który jest używany do ładniejszych adresów URL, i wybiera, czy chce statycznej treści, czy struktury opartej na artykułach.Dynamiczne adresy URL Django

Moje podejście jest następujące: Stworzyłem aplikację o nazwie sitemanager, która składa się z opisanego powyżej modelu strony i procesora kontekstowego, który dodaje strony do kontekstu moich szablonów (dla menu itp.) I to działa w porządku.

Oczywiście, ja również potrzebuję podpiąć to do mojego pliku url, ale tutaj zaczyna się problem: mogę, dzięki pythonicowej strukturze Django, odzyskać model Page w ciągu urls.py i wygenerować mój wzór adresu URL odpowiednio, i to pokazuje, ale Django wydaje się buforować ten plik (co zwykle ma sens), więc zmiany będą miały miejsce dopiero po restarcie serwera. To oczywiście nie do przyjęcia.

Moim pierwszym pomysłem jest jakoś doprowadzenie aplikacji administratora do zresetowania pamięci podręcznej adresów URL, jeśli nowe strony są dodawane lub usuwane, lub aliasy są modyfikowane (i tylko wtedy, ponieważ buforowanie ogólnie jest dobre), ale ja nie mam pomysł, jak zacząć.

A może jest jeszcze prostsze rozwiązanie, którego nie widzę w tej chwili?

Odpowiednia część mojego urls.py wygląda w zasadzie tak:

from sitemanager.models import Page 
static_pages = Page.objects.filter(static=True) 
article_pages = Page.objects.filter(static=False) 
for page in static_pages: 
    pattern = r'^/'+page.alias+'/$' 
    urlpatterns += patterns('', 
     url(pattern, 'views.static_page', 
      { 'active': page } 
     ) 
    ) 
# Pretty much the same for the article pages, 
# but with includes of another app 

Mam nadzieję, że nie popełniłem zbyt wiele błędów podczas zdejmowania tego kodu w mojej głowie!

Odpowiedz

13

Możesz użyć adresu named groups w adresach URL, aby przekazywać dane do widoków i nie będzie wymagać dynamicznej aktualizacji adresów URL. Nazwana część zawierająca page.alias zostanie po prostu przekazana jako argument słowa kluczowego do funkcji widoku. Możesz go użyć, aby uzyskać rzeczywisty obiekt strony.

# urls.py 
urlpatterns += patterns('', 
    (r'^(?P<page_alias>.+?)/$', 'views.static_page'), 
) 

# views.py 
def static_page(request, page_alias): # page_alias holds the part of the url 
    try: 
     active = Page.objects.get(page_alias=page_alias) 
    except Page.DoesNotExist: 
     raise Http404("Page does not exist") 
2

Nie potrzebujesz konkretnego adresu URL dla każdego elementu w całej bazie danych.

Nie widząc twojego widoku, domyślam się, że możesz uciec z jednym adresem URL lub kilkoma adresami URL.

Jako przykład:

#urls.py 
urlpatterns = patterns('yourapp.views', 
url(r'^static_pages/(?P<static_pages_id>\d+)/(?P<True_or_False>\D+)$', your_view_here, name='your_name_here'), 
) 

#views.py 
def your_view_here(request, static_pages_id, True_or_False): 
    obj = get_object_or_404(Page, pk=static_pages_id) 
    if True_or_False: 
     #do something when True 
Powiązane problemy