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:

sudo easy_install jinja2

Y medianteapten debian y derivados:

sudo apt-get install python-jinja2

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:

# jinja_helper.py
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:

# views.py
from jinja_helper import render_to_response

def index(request):
    title = "hello world."
    return render_to_response('index.html', locals())
<!-- index.html -->
<h1>{{ title }}</h1>


Read more »

Tags: , ,