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

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.

5 3 votes
Article Rating
guest
0 komentarzy
Inline Feedbacks
View all comments