Przejdź do treści

Sekrety Django Templates #2. Nieznane tagi, które ułatwią Ci obsługę list

Sprawdź wszystkie części serii Sekrety Django Templates:

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:

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