2010-08-04 9 views
27

Lernen django & Python.Django URLs direkt zu HTML-Vorlage

Richten Sie einfach eine neue Website ein, nachdem Sie das Lernprogramm durchgeführt haben. Nun, um Argumente zu sagen, ich möchte ein paar Über uns, FAQ grundlegende HTML-Seiten mit sehr begrenzten dynamischen Elemente hinzufügen, gehen Sie weiter und schreiben Sie eine neue Zeile in meiner Urls.py-Datei für jede Seite? Oder ist es eine nette Art zu sagen, alle * * .html direkt auf die entsprechende .html Datei abzubilden?

Im Allgemeinen, auch wenn es eine Ansicht erfordert, muss ich eine neue Zeile in der Datei url.py für jede Seite schreiben?

Antwort

25

Solange in der URL ein eindeutiger Identifizierungsabschnitt vorhanden ist, müssen Sie für jede Direktvorlagen-URL keinen Eintrag in urls.py erstellen.

Zum Beispiel könnte man sagen, dass alles Endung Urls in „.html“ ist eine direkte Datei aus den Vorlagen verweisen.

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

Weitere Informationen finden Sie unter http://docs.djangoproject.com/en/1.2/ref/generic-views/#django-views-generic-simple-direct-to-template.

+3

Danke, war nicht genau das, was ich brauchte, aber das hat den Trick gemacht. ('. (+ \ Html) $', direct_to_template), –

+1

Django 1.6: Kein Modul einfach – Timo

1

Eine Möglichkeit wäre, eine einzelne benutzerdefinierte Ansicht zu schreiben, die die generische Ansicht direct_to_template umschließt. Der Wrapper könnte einen Parameter akzeptieren und dementsprechend den Namen der Vorlage bilden und ihn an direct_to_template übergeben. Auf diese Weise können Sie mehrere Seiten mit einer einzelnen URL-Konfiguration routen.

Etwas wie folgt aus:

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 

Das sagte ich vermute, dass da draußen bessere Lösungen gibt es aber.

12

Schreiben Sie eine URL, die die statischen Seiten packt Sie interessiert sind

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

Die staticpage-View-Funktion in 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 

Natürlich müssen Sie eine Namenskonvention für Ihre Vorlagen folgen , aber dieses Muster kann nach Bedarf erweitert werden.

Dies ist besser als das .+\.html Muster, weil es Vorlagen behandelt, die nicht als 404s existieren, während .+\.html mit 500 Fehlern explodiert, wenn die Vorlage nicht existiert.

10

Wenn Sie mit den class based views weil direct_to_template hat deprecated gewesen, können Sie einen einfachen Wrapper erstellen, die direkt Ihre eigenen Vorlagen macht:

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() 

und in Ihrem Router:

from myapp.static.views import StaticView 

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

Need 'von django benannt.http Import Http404' in Router ('urls.py') – hobs

+0

Großartig, ist der erste Punkt zum Ausdruck" viele Zeichen "und der zweite Punkt (Escape), um Dateinamen und HTML-Typ zu trennen? – Timo

+0

@Timo, wenn Sie url regex fragen; . + Bedeutet Datei Slug (ohne Dateierweiterung) und \ .html erzwingt, dass es eine HTML-Datei für die URLs und die Datei selbst sein muss. hardcoded. – kirpit

12

Aktuell der beste Weg, dies zu tun, wird mit TemplateView von generischen Klasse basierten Ansichten:

from django.views.generic.base import TemplateView 

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

Wenn Sie möchten, dass eine einzelne Seite direkt als Ansicht gerendert wird, ohne zusätzlichen Kontext, ist dies der einfachste Weg! – Thismatters