Integrando Mako com Django

Postado por Rafael Sierra em 21/09/2007

Pra quem não conhece, Mako é um Template Engine que permite código Python nativo dentro do template, e isso é algo que eu particularmente sinto falta nos templates do Django, você não pode enviar um objeto pra dentro do template do Django e chamar funções baseadas em parametros pra recuperar alguma informação, assim como também não pode acessar uma chave de um dicionário ou um índice de uma lista, pra fazer esse tipo de coisa tinhamos que recorrer a criação de `tags` ou mesmo ter que criar uma função na classe que não recebesse parametros pra retornar determinada informação.

Pois bem, foram-se os dias de sofrimento com templates em Django, para habilitar o Mako dentro do Django, vamos precisar criar apenas uma tag, que chamarei de `mako`, para isso crie dentro de um de seus aplicativos a pasta `templatetags` e dentro dessa pasta crie dois arquivos: `__init__.py` e `wako.py`[1]

Edite o arquivo `wako.py` e acrecente as seguintes linhas:
[python]
import mako.template as mako
from django import template
register = template.Library()

def do_mako(parser, token):
nodelist = parser.parse(('endmako',))
parser.delete_first_token()
return makoNode(nodelist)
class makoNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
block = self.nodelist.render(context)

parameters = {}
[parameters.update(parameter) for parameter in context]

rendered = mako.Template(block, format_exceptions=True).render(**parameters)
return rendered
register.tag('mako', do_mako)
[/python]

Agora sempre que você precisar usar as funcionalidades do mako dentro do seu template adicione a seguinte linha à seu template:

{% load wako %}

E em seguida crie o blocos `{% mako %}{% endmako %}` e escreva seu código dentro dele, como por exemplo:
[html]
{% load wako %}

Generated by Mako template engine

Here is the GET of `request`

    {% mako %}
    % for var in request.GET.keys():

  • ${var}: ${request.GET[var]}
  • % endfor
    {% endmako %}


[/html]

[1] - Tive que dar esse nome pra não dar problemas com o nome do pacote do próprio mako

PS.: Sei que não preciso dizer isso, mas não saia desenvolvendo templates como se você estivesse em PHP, template foi feito pra exibição de dados, se você usar os templates pra alterar valores na base de dados ou executar regras de negócio eu vou revogar todos seus direitos de programador, "Use com moderação" :P

Os scripts Python aqui apresentado foram criados por Jerry Stratton em seu post Embedding Mako into Django e adaptados por mim (faltavam alguns imports no exemplo dele)

1 Comentário para “Integrando Mako com Django”

  1. Walter Cruz disse em 21/09/2007 as 19:08

    Mas até que é uma boa poder fazer uma lógica básica em templates :D

Trackback URI | RSS dos comentários

Deixe um comentário

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.