2010-08-04 20 views
27

Learning django & python.URL di Django direttamente in html template

Basta impostare un nuovo sito dopo aver fatto il tutorial. Ora per argomenti diciamo che voglio aggiungere un po 'di Chi siamo, FAQ html di base con elementi dinamici molto limitati, vai avanti e scrivi una nuova riga nel mio file urls.py per ogni pagina? o è il loro modo carino di dire map all * * .html direttamente nel file .html rilevante?

In generale, anche se richiede una vista, dovrò scrivere una nuova riga nel file url.py per ogni pagina?

risposta

25

Fintantoché esiste una sezione di identificazione univoca nell'URL, non sarà necessario creare una voce in urls.py per ogni url di modello diretto.

Ad esempio, si potrebbe dire che tutti gli URL che terminano in ".html" fanno riferimento a un file diretto dai modelli.

urlpatterns = patterns('django.views.generic.simple', 
    (r'(.+\.html)$', 'direct_to_template'), 
    # ... 
) 

Dai un'occhiata a http://docs.djangoproject.com/en/1.2/ref/generic-views/#django-views-generic-simple-direct-to-template per i dettagli.

+3

Grazie, non era esattamente quello di cui avevo bisogno ma questo ha funzionato. ('(. + \. Html) $', direct_to_template), –

+1

Django 1.6: Nessun modulo denominato simple – Timo

1

Un modo per farlo sarebbe scrivere una singola vista personalizzata che avvolge la vista generica direct_to_template. Il wrapper potrebbe accettare un parametro e di conseguenza formare il nome del modello e passarlo a direct_to_template. In questo modo puoi indirizzare più pagine con una singola configurazione URL.

Qualcosa di simile a questo:

url(r'^foo/(?P<page_name>\w+).html$', 'my_static_wrapper', name = 'my_static_wrapper'), 

def my_static_wrapper(request, page_name): 
    # form template name and call direct_to_template 

Detto questo ho il sospetto che non ci sono soluzioni migliori là fuori però.

12

Scrivi un URL che afferra le pagine statiche che ti interessa

url(r'^(?P<page_name>about|faq|press|whatever)/$', 'myapp.staticpage', name='static-pages') 

La funzione staticpage vista myapp

from django.views.generic.simple import direct_to_template 
from django.http import Http404 

def staticpage(request, page_name): 
    # Use some exception handling, just to be safe 
    try: 
     return direct_to_template(request, '%s.html' % (page_name,)) 
    except TemplateDoesNotExist: 
     raise Http404 

Naturalmente, è necessario seguire una convenzione di denominazione per i modelli , ma questo schema può essere ampliato secondo necessità.

Questo è migliore del modello .+\.html perché tratterà modelli che non esistono come 404, mentre .+\.html esploderà con 500 errori se il modello non esiste.

10

Se si sta utilizzando il class based views perché direct_to_template è stato deprecated, è possibile creare un semplice wrapper che rende i propri modelli direttamente:

from django.views.generic import TemplateView 
from django.template import TemplateDoesNotExist 
from django.http import Http404 

class StaticView(TemplateView): 
    def get(self, request, page, *args, **kwargs): 
     self.template_name = page 
     response = super(StaticView, self).get(request, *args, **kwargs) 
     try: 
      return response.render() 
     except TemplateDoesNotExist: 
      raise Http404() 

e nel router:

from myapp.static.views import StaticView 

urlpatterns = patterns('', 
    url(r'^(?P<page>.+\.html)$', StaticView.as_view()), 
    # ... 
) 
+0

Need 'from django.http import Http404' nel router ('urls.py') – hobs

+0

Great, è il primo punto ad esprimere" molti caratteri "e il secondo punto (escape) per separare il nome del file e il tipo html? – Timo

+0

@Timo, se si sta chiedendo url regex; . + Significa file slug (senza estensione file) e \ .html impone che debba essere un file .html per gli URL e il file stesso. hardcoded. – kirpit

12

Attualmente il modo migliore per farlo è utilizzare TemplateView da viste generiche basate su classi:

from django.views.generic.base import TemplateView 

url(r'^$', TemplateView.as_view(template_name='index.html'), name='home'), 
+1

Se vuoi solo una singola pagina da renderizzare direttamente come una vista, senza contesto aggiuntivo, questo è il modo più semplice per farlo! – Thismatters