Condividere parti di codice tra template diversi in Django

Realizzando qualche nuova feature in questo blog mi sono ritrovato nella situazione in cui, all'interno di template diversi, avevo degli oggetti identici da visualizzare. Sfogliando il manuale di Django ho trovato gli inclusion tag. Realizzarli è abbastanza semplice:

Prima di tutto si realizza un template che contiene l'oggetto da riprodurre. Nel nostor esempio lo salviamo bel file post.html.

<div class="signature">
Pubblicato da {{mydata.first_name}} {{mydata.last_name}}...
</div>

Poi occorre definire un nuovo elemento di libreria che viene salvato nella sottodirectory templatetags all'interno della directory dell'applicazione in cui vogliamo utilizzarlo. Il decorator @register.inclusion_tag('post.html') farà in modo di legare il nostro template da includere al tag da utilizzare al suo posto. Questo è il contenuto del file post.py. La libreria, quindi, si chiamerà post.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from django import template
register = template.Library()

@register.inclusion_tag('post.html')
def postfooter(postObject):
    return {'mydata': postObject}

La funzione che abbiamo definito come elemento di libreria postfooter(postObject) sarà il nome del nostro nuovo tag che prevede un parametro. Per averlo disponibile dentro i template che lo dovranno utilizzare inseriamo una riga in testa ad ogni template in cui facciamo il load della libreria.

...
{% load post %}
...
{% postfooter myvar %}                
...

Il tag {% postfooter myvar %} non farà altro che processare il template e produrre l'output che ne deriva.

Pubblicato da Silvano Sartore, venerdì 10 aprile 2009, nella categoria programmazione.
Etichette: templates, librerie, html, django e python.