2010-08-04 13 views
27

Aprendizaje django & python.URL de Django directamente a la plantilla html

Simplemente configure un nuevo sitio después de hacer el tutorial. Ahora, por los argumentos, decir que quiero agregar un montón de Acerca de nosotros, preguntas frecuentes, páginas html básicas con elementos dinámicos muy limitados, ¿sigues y escribes una nueva línea en mi archivo urls.py para cada página? ¿o es su forma más clara de decir map all * * .html directamente al archivo .html relevante?

En general, aunque requiera una vista, ¿tendré que escribir una nueva línea en el archivo url.py para cada página?

Respuesta

25

Siempre que haya alguna sección de identificación única en la URL, no será necesario crear una entrada en urls.py para cada URL de plantilla directa.

Por ejemplo, podría decir que todas las URL que terminan en ".html" hacen referencia a un archivo directo de las plantillas.

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

Tome un vistazo a http://docs.djangoproject.com/en/1.2/ref/generic-views/#django-views-generic-simple-direct-to-template para más detalles.

+3

Gracias, no era exactamente lo que necesitaba, pero esto funcionó. ('(. + \. Html) $', direct_to_template), –

+1

Django 1.6: Ningún módulo llamado simple – Timo

1

Una forma de hacer esto sería escribir una única vista personalizada que ajuste la vista genérica direct_to_template. El contenedor podría aceptar un parámetro y, en consecuencia, formar el nombre de la plantilla y pasarlo al direct_to_template. De esta manera puede enrutar varias páginas con una sola configuración de URL.

Algo como esto:

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 

Dicho esto sospecho que hay mejores soluciones por ahí sin embargo.

12

Escribir una URL que agarra las páginas estáticas que le interesan

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

La función staticpage vista en 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 

Por supuesto, es necesario seguir una convención de nomenclatura para sus plantillas , pero este patrón se puede expandir según sea necesario.

Esto es mejor que el patrón .+\.html porque tratará las plantillas que no existen como 404, mientras que .+\.html explotará con 500 errores si la plantilla no existe.

10

Si está utilizando el class based views porque direct_to_template ha sido deprecated, se puede crear un contenedor simple que hace que sus propias plantillas directamente:

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

y en el router:

from myapp.static.views import StaticView 

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

Necesita 'de django.http importación Http404' en el enrutador ('urls.py') – hobs

+0

Genial, ¿es el primer punto para expresar" muchos caracteres "y el segundo punto (escapado) para separar el nombre de archivo y el tipo html? – Timo

+0

@Timo, si le preguntas a url regex; . + Significa archivo slug (sin extensión de archivo) y \ .html obliga a que sea un archivo .html para las URL y el archivo en sí. codificado – kirpit

12

Actualmente La mejor forma de hacerlo es utilizando TemplateView desde vistas genéricas basadas en clases:

from django.views.generic.base import TemplateView 

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

Si solo desea que una página se represente directamente, sin contexto adicional, ¡esta es la forma más fácil de hacerlo! – Thismatters

Cuestiones relacionadas