Django es el entorno de desarrollo web para perfeccionistas con límites de tiempo

Agrupar mediante el templatetag {% regroup %} con una función propia

El templatetag {% regroup %} del lenguaje de plantillas de Django nos permite agrupar un listado de objetos por una propiedad. Generalmente utilizamos un campo por el que agrupar pero también podemos utilizar una función propia para agrupar los objetos como queramos.

Vamos a ver un ejemplo sencillo en el que agruparemos un listado de artículos por su fecha de publicación, dividiéndolos en artículos publicados "Esta semana", "La semana pasada" y "Hace X semanas". El siguiente models.py tiene un modelo Articulo con una fecha de publicación que nos servirá para hacer la agrupación. La función semana_group del modelo nos permitirá separar los artículos en grupos distintos según la diferencia de días entre hoy y la fecha de publicación de cada artículo:

from django.db import models
import datetime

class Articulo(models.Model):
    titulo = models.CharField(max_length=250)
    fecha = models.DateField()

    def semana_group(self):
        hoy = datetime.date.today()
        dias = (hoy - self.fecha).days

        if dias <= 7:
            group = 'Esta semana'
        elif dias <= 14:
            group = 'La semana pasada'
        else:
            group = 'Hace %s semanas' % str(dias/7)

        return group

En nuestra vista nos bastaría con listar todos los artículos o filtrar por cualquier atributo. Por ejemplo:

articulos = Articulo.objects.all()

Y en nuestra plantilla es donde utilizaremos el templatetag {% regroup %} agrupando el listado de artículos por el método semana_group que hemos añadido al modelo:

{% regroup articulos by semana_group as articulos_por_semana %}

{% for articulos in articulos_por_semana %}
    <h2>{{ articulos.grouper }}</h2>
    <ul>
    {% for articulo in articulos.list %}
        <li>{{ articulo.titulo }}</li>
    {% endfor %}
    </ul>
{% endfor %}

Publicado por Antonio Melé el Sábado 21 de Agosto de 2010 Compártelo: Facebook: Twitter: | Categorías: modelos, plantillas, trucos

Entradas similares

Representar campos con choices en nuestras plantillas

Cuando usamos un campo con diferentes opciones (choices) en nuestro modelo utilizamos una lista de elementos cada uno con el valor real que se ...


Crear una imagen de nuestros modelos con django-command-extensions

Algo interesante que nos aporta django-command-extensions es poder crear una representación gráfica de nuestros modelos (o por decirlo de otro modo nuestro esquema de ...


 
Settings accesibles desde las plantillas

Muchas veces deseamos acceder a los settings de nuestro proyecto desde alguna de nuestras plantillas. Lo ideal es crear un context processor que nos ...


Templatetag {% if %} con más comparaciones

Este snippet reemplaza la funcionalidad del templatetag {% if %} permitiendo realizar comparaciones con operadores >, <, >=, <=, != además de las comparaciones que permite hacer {% if %} por defecto. Por ...


 
 

3 comentarios:

El Sábado 28 de Agosto de 2010 Roylan Suarez Reyes dijo:
Bestial lo probé aquí: http://www.pri.jovenclub.cu/jc/linux/accounts/profiles/
El Domingo 29 de Agosto de 2010 Antonio Melé dijo:
Genial Roylan, Me alegra ver que es de utilidad :)
El Miércoles 26 de Enero de 2011 Nacho dijo:
¡No lo conocía! ¿Alguna manera de pasar el request a la función agrupadora? En concreto para poder acceder al usuario. Gracias.

Escribe un comentario: