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 }}