Has aprendido el uso básico del sistema de plantillas; ahora vamos a usar este
conocimiento para crear una vista. Recordemos la vista current_datetime
en
mysite.views
, la que comenzamos en el capítulo anterior. Se veía como
esto:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
Vamos a cambiar esta vista usando el sistema de plantillas de Django. Primero, podemos pensar en algo como esto:
from django.template import Template, Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
t = Template("<html><body>It is now {{ current_date }}.</body></html>")
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
Seguro, esto usa el sistema de plantillas, pero no soluciona el problema que planteamos en la introducción de este capítulo. A saber, la plantilla sigue estando embebida en el código Python. Vamos a solucionar esto poniendo la plantilla en un archivo separado, que la vista cargará.
Puedes primer considerar guardar la plantilla en algún lugar del disco y usar
las funcionalidades de Python para abrir y leer el contenido de la plantilla.
Esto puede verse así, suponiendo que la plantilla esté guardada en
/home/djangouser/templates/mytemplate.html
:
from django.template import Template, Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
# Simple way of using templates from the filesystem.
# This doesn't account for missing files!
fp = open('/home/djangouser/templates/mytemplate.html')
t = Template(fp.read())
fp.close()
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
Esta aproximación, sin embargo, es poco elegante por estas razones:
- No maneja el caso en que no encuentre el archivo. Si el archivo
mytemplate.html
no existe o no es accesible para lectura, la llamada aopen()
levantará la excepciónIOError
. - Involucra la ruta de tu plantilla. Si vas a usar esta técnica para cada una de las funciones de las vistas, estarás duplicando rutas de plantillas. ¡Sin mencionar que esto implica teclear mucho más!
- Incluye una cantidad aburrida de código repetitivo. Tienes mejores cosas
para hacer en vez de escribir
open()
,fp.read()
yfp.close()
cada vez que cargas una plantilla
Para solucionar estos problemas, usamos cargadores de plantillas y directorios de plantillas, los cuales son descritos en las secciones que siguen.