Alternativa al sistema de templates de Django, parte 1: Jinja2
Django es un gran framework web pero tiene un sistema de templates que a un programador puede resultarle un tanto limitado:
- No es posible asignar variables ni cambiar sus valores.
- No hay distinción entre métodos y propiedades.
- No es posible pasar parámetros a los métodos.
- No existe la sentencia elif ! :P
Hay varias alternativas entre las que elegir: Jinja2, Mako, Genshi, Cheetah. De todas, Jinja2 es el que tiene la sintáxis más compatible con Django, pero tiene otra filosofía y por lo tanto permite hacer más cosas. Empecemos entonces por la instalación.
Instalación de Jinja2
Jinja puede instalarse medianteeasy_install:
Y medianteapten debian y derivados:
Integración con Django
El diseño de bajo acoplamiento de Django permite que usar otro sistema de templates sea sencillo. Para Jinja basta con definir una variable de ambiente y escribir los métodos alternativos pararender_to_stringyrender_to_response. A continuación muestro la forma más simple que encontré. Hay otras más sofisticadas por ahí (esta y esta) pero básicamente hacen lo mismo:
from django.conf import settings
from django.http import HttpResponse
from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(
loader=FileSystemLoader(getattr(settings, 'TEMPLATE_DIRS')))
def render_to_string(template_path, context=None, **kwargs):
template = jinja_env.get_template(template_path)
context = dict(context or {})
return template.render(**context)
def render_to_response(template_path, context=None, **kwargs):
return HttpResponse(render_to_string(template_path, context, **kwargs),
mimetype=None)
La vista entonces no difiere mucho de una vista tradicional:
from jinja_helper import render_to_response
def index(request):
title = "hello world."
return render_to_response('index.html', locals())





