BOMBOLOM.COM

(django) Criar um Template Context

Posted by José Lopes

Num projecto necessitei de utilizar uma constante definida no settings em vários templates. Eu queria utilizá-la da seguinte forma:

{{ MINHA_CONSTANTE }}

Inicialmente passei a constante pelo context de cada view mas depois, lembrando-me do princípio DRY (não nos repetirmos), fiz uso do TEMPLATE_CONTEXT_PROCESSORS para ter a constante disponível em qualquer template do projecto.

Este artigo mostra como criar um template context ou, como é mencionado na documentação do Django, Custom context processors.

Para melhor entender este conceito vamos utilizar um examplo:
Temos um texto que queremos truncar após um determinado número de palavras, número esse que será o mesmo em várias páginas do projecto.

Criamos a constante TRUNCAR nos settings do projecto, permitindo um controle fácil do número de palavras para truncar (só um sítio a mudar se for o caso).

Criamos de seguida o ficheiro nosso_template_tags.py em qualquer ponto do projecto. Eu utilizo a directoria utils para este tipo de ficheiros (não esquecer de incluir o ficheiro __init__.py nesta directoria).

Voltando ao ficheiro, ele deve conter algo do tipo:

from django.conf import settings

def truncar_palavras(context):
    return {'TRUNCAR': settings.TRUNCAR}

O resultado deve ser sempre um dicionário, onde podemos colocar vários valores. É bastante poderoso!

Agora vamos acrescentar o context processor no ficheiro settings.py do projecto:

TEMPLATE_CONTEXT_PROCESSORS = ('NOSSO_PROJECTO.utils.nosso_template_tags.truncar_palavras')

Claro está que podemos acrescentar tantos quanto necessário.

Para que isto funcione a view em causa tem de ter um RequestContext, como por exemplo:

from django.template import RequestContext
from django.shortcuts import render_to_response

def nossa_view(request):
    ...
    context = { 'BLOCO_DE_TEXTO': DADOS_DE_UM_MODELO }
    return render_to_response(
        'NOSSO_TEMPLATE.html',
        context,
        context_instance = RequestContext(request))

E já está!

No NOSSO_TEMPLATE.html podemos combinar o context que definimos na view com o nosso template context:

{{ TEXT_BLOCK|truncatewords:TRUNCAR }}
22.06.2009 | Ler mais | Comentários | Tags , ,

Voltar à Página principal | Made with PyBlosxom