Sprawdź wszystkie części serii Sekrety Django Templates:
- Sekrety Django Templates #1. Html na sterydach
- Sekrety Django Templates #2. Nieznane tagi, które ułatwią Ci obsługę list
Jeśli nie wiesz, czym są Django templates, to zapraszam Cię tutaj, gdzie opisuję ich działanie i zastosowanie.
Jeśli jednak jesteś już “w temacie” i chcesz poznać kilka sztuczek dotyczących obsługi list w szablonach Django, to zostań ze mną .
Pozwól, że posłużę się dziś przykładem pizzy i zdefiniuję w widoku następującą listę:
pizza_menu = ['Margherita', 'Hawajska', 'Capriciosa', 'Salami', 'Vegetariana']
A teraz zagrajmy w małą grę.
Ty pytasz. Ja odpowiadam.
I pokazuję, jak będzie wyglądało menu pizzerii w każdej opisanej sytuacji.
1. Jak iterować po liście?
Podstawową operacją, jaką wykonujemy w szablonach html jest iteracja po elementach listy.
Do rozpoczęcia przejścia po liście wykorzystaj tag {% for .. in .. %}
.
Nie zapomnij też o znaczniku zamykającym pętlę: {% endfor %}.
{% for pizza in pizza_menu %}
<div>{{ pizza }}</div>
{% endfor %}
Margherita
Hawajska
Capriciosa
Salami
Vegetariana
2. A może da się iterować od końca?
No pewnie! Dopisz tylko słowo reversed
, a elementy listy ustawią się w odwrotnej kolejności.
{% for pizza in pizza_menu reversed %}
<div>{{ pizza }}</div>
{% endfor %}
Vegetariana
Salami
Capriciosa
Hawajska
Margherita
3. Jak sprawdzić indeks aktualnego elementu listy?
Jeśli chcesz odwołać się do indeksu elementu listy, wykorzystaj wbudowane zmienne rozpoczynające się od prefiksu {{ forloop.[..] }}
.
Django udostępnia różne sposoby indeksacji list:
{{ forloop.counter0 }}
Ta zmienna numeruje elementy rozpoczynając liczenie od 0:
{% for pizza in pizza_menu %}
<div>
{{ forloop.counter0 }} - {{ pizza }}
</div>
{% endfor %}
0 - Margherita
1 - Hawajska
2 - Capriciosa
3 - Salami
4 - Vegetariana
{{ forloop.counter }}
Tym razem numeracja rozpoczyna się od 1:
{% for pizza in pizza_menu %}
<div>
{{ forloop.counter }} - {{ pizza }}
</div>
{% endfor %}
1 - Margherita
2 - Hawajska
3 - Capriciosa
4 - Salami
5 - Vegetariana
{{ forloop.revcounter0 }}
A cóż to takiego? Zmienna revcounter0
pozwala na odwróconą numerację listy, licząc od 0. Elementy wyświetlają się w normalnej kolejności, ale wartości ich indeksów układają się malejąco.
{% for pizza in pizza_menu %}
<div>
{{ forloop.revcounter0 }} - {{ pizza }}
</div>
{% endfor %}
4 - Margherita
3 - Hawajska
2 - Capriciosa
1 - Salami
0 - Vegetariana
{{ forloop.revcounter }}
Sytuacja podobna do poprzedniej, jednak numeracja kończy się na 1.
{% for pizza in pizza_menu %}
<div>
{{ forloop.revcounter }} - {{ pizza }}
</div>
{% endfor %}
5 - Margherita
4 - Hawajska
3 - Capriciosa
2 - Salami
1 - Vegetariana
Zwróć uwagę, że domyślnie counter liczy indeksy od 1, czyli odwrotnie niż jesteśmy do tego przyzwyczajeni. Chyba ktoś nie do końca to przemyślał, ale z drugiej strony warto docenić fakt, że mamy do dyspozycji aż cztery sposoby numeracji. ?
4. Jak znaleźć pierwszy / ostatni element?
Chcesz wyświetlić dodatkową informację tylko w pierwszym lub ostatnim elemencie listy? Nie ma problemu. Użyj odpowiednio {{ forloop.first }}
lub {{ forloop.last }}
. Te zmienne zwrócą wynik True
, jeśli spełniony będzie ich warunek.
{{ forloop.first }}
{% for pizza in pizza_menu %}
<div>
{{ pizza }}
{% if forloop.first %} - MNIAM
{% endif %}
</div>
{% endfor %}
Margherita - MNIAM
Hawajska
Capriciosa
Salami
Vegetariana
{{ forloop.last }}
{% for pizza in pizza_menu %}
<div>
{{ pizza }}
{% if forloop.last %} - MNIAM
{% endif %}
</div>
{% endfor %}
{% for pizza in pizza_menu %}
<div>
{{ pizza }}
{% if forloop.last %} - MNIAM
{% endif %}
</div>
{% endfor %}
Margherita
Hawajska
Capriciosa
Salami
Vegetariana - MNIAM
5. Jak sprawdzić czy lista jest pusta?
Oczywiście możesz wykorzystać składnię {% if ... else %}
, ale istnieje czytelniejszy sposób. Wewnątrz bloku obsługującego pętlę wstaw tag
{% empty %}.
<ul>
{% for pizza in pizza_menu %}
<li>{{ pizza.name }}</li>
{% empty %}
<li>Wszystko zjedzone :( </li>
{% endfor %}
</ul>
Po wyczyszczeniu listy zobaczyłam taki komunikat:
Wszystko zjedzone :(
I to by było na tyle z naszego pobytu w pizzerii. Nie wiem jak Ty, ale ja zgłodniałam. ?
Podsumowanie
Jak widzisz, wbudowane tagi w Django templates oferują szerokie możliwości i zastosowania. W tym artykule zaprezentowałam jedynie wybrane przykłady związane z obsługą list. Pełną listę dostępnych zmiennych możesz znaleźć w oficjalnej dokumentacji.
Zdarzyło Ci się wykorzystać w praktyce któryś z powyższych przykładów? A może znasz jeszcze jakieś ciekawe triki? Podziel się swoją opinią w komentarzu.
Sprawdź wszystkie części serii Sekrety Django Templates:
- Sekrety Django Templates #1. Html na sterydach
- Sekrety Django Templates #2. Nieznane tagi, które ułatwią Ci obsługę list