posts
Django: Regroup template tag
Als intern project moest er een timesheetapplication worden gebouwd. Qua datamodel niet echt moeilijk maar er was toch 1 probleempje dat zich stelde bij de rapportering. De uren moesten per klant per project getoond worden.
Wanneer je alle rijen uit de database haalt krijg je per rij een herhaling van de projectnaam en de klantnaam. In plaats van de queryset te overlopen en zelf custom dictionaries te bouwen bestaat er in django een template tag waarbij je een dictionary kan hergroeperen op een bepaalde kolom.
Voorbeeld:
onderstaande dictionary noemt 'hours'
[
{'project_name':'project1', 'client_name': 'klant1', 'hour':'1'},
{'project_name':'project1', 'client_name': 'klant1', 'hour':'2'},
{'project_name':'project2', 'client_name': 'klant2', 'hour':'1.5'},
{'project_name':'project2', 'client_name': 'klant2', 'hour':'1.5'},
{'project_name':'project3', 'client_name': 'klant3', 'hour':'1.5'},
]
in de template schrijf je dan:
{% regroup hours by client_name as client_list %}
{% for client in client_list %}
<h2>{{ client.grouper }}</h2>
{% regroup client.list by project_name as project_list %}
{% for project in project_list %}
<h3>{{ project.grouper }}</h3>
{% for hour in project.list %}
<h4>{{ hour.hour }}</h4>
{% endfor %}
{% endfor %}
{% endfor %}
Uitleg:
via de regroup tag geef je aan welke dictionary je wilt hergroeperen, op welk veld en vervolgens hoe de nieuwe dictionary moet noemen. Vervolgens kan je hierover itereren en heb je 2 properties beschikbaar:
- grouper (de waarde van de kolom waarop je hebt gegroepeerd)
- list (de lijst met objecten)
client.grouper is dus de waarde van de kolom client_name,
project.grouper is de waarde van de kolom project_name.