2012-02-25 24 views
9

Sto sviluppando un sito Web utilizzando Django come back-end e voglio consentire al cliente di aggiungere nuove pagine utilizzando l'interfaccia di amministrazione, quindi inserisce un titolo di pagina, un alias di pagina che viene utilizzato per gli URL più belli, e sceglie se vuole contenuti statici o una struttura basata su articoli.URL dinamici Django

Il mio approccio è il seguente: Ho creato un'applicazione chiamata sitemanager costituita dal modello di pagina sopra descritto e un processore di contesto che aggiunge le pagine al contesto dei miei modelli (per i menu, ecc.) E funziona bene.

Naturalmente, ho anche bisogno di agganciarlo nel mio url file, ma qui è dove inizia il problema: posso, grazie alla struttura divinatorio di Django, recuperare il modello Page all'interno urls.py, e generare il mio modello di URL di conseguenza, e lo fa, ma Django sembra archiviare quel file (che di solito ha senso), quindi le modifiche avverranno solo dopo il riavvio del server. Questo ovviamente non è accettabile.

La mia prima idea sarebbe in qualche modo portare l'applicazione di amministrazione a reimpostare la cache dell'URL se vengono aggiunte nuove pagine o eliminate, o gli alias vengono modificati (e solo allora, perché la memorizzazione nella cache è generalmente una buona cosa), ma non ho idea di come iniziare da lì.

O forse c'è anche una soluzione più semplice che non vedo al momento?

La parte rilevante della mia urls.py sembra sostanzialmente in questo modo:

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 

spero Non ho fatto troppi errori, mentre nudo che il codice nella mia testa!

risposta

13

È possibile utilizzare named groups negli URL per passare i dati alle viste e non richiede alcun aggiornamento dinamico negli URL. La parte denominata contenente page.alias verrà semplicemente passata come argomento della parola chiave alla funzione di visualizzazione. Puoi usarlo per ottenere l'oggetto Page reale.

# 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

Non è necessario un URL specifico per ciascun elemento nell'intero database.

Senza vedere la tua vista, suppongo che tu possa farla franca con un URL, o forse con qualche URL.

Per fare un esempio:

#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