Uniwersalne makro: multi_columns(items, cols)
Zawartość pliku z makrem macros.html
{% macro multi_columns(items, cols) %}
{% set total = items|length %}
{% set size = (total // cols) + (1 if total % cols > 0 else 0) %}
<div style="display: flex; gap: 20px;">
{% for col in range(cols) %}
<div style="flex: 1;">
{% set start = col * size %}
{% set end = start + size %}
{% for item in items[start:end] %}
<div class="row">{{ item }}</div>
{% endfor %}
</div>
{% endfor %}
</div>
{% endmacro %}
Przykład użycia
{% import "macros.html" as ui %}
{{ ui.multi_columns(dane, 3) }}Jeśli elementy to obiekty wystarczy zmienic {{item}} na oczekiwana zawartość np.
<div>
<strong>{{ item.nazwa }}</strong>
<span>{{ item.opis }}</span>
<span>Wartość: {{ item.wartosc }}</span>
</div>Opcja zaawansowana
Opcja bardziej zaawansowana pozwalająca na uniwersalna funkcję która może użyć funkcji formatującej item.
Dzięki caller() możesz przekazać własny sposób renderowania elementu.
{% macro multi_columns(items, cols, caller=None) %}
{% set total = items|length %}
{% set size = (total // cols) + (1 if total % cols > 0 else 0) %}
<div style="display: flex; gap: 20px;">
{% for col in range(cols) %}
<div style="flex: 1;">
{% set start = col * size %}
{% set end = start + size %}
{% for item in items[start:end] %}
{% if caller %}
{{ caller(item) }}
{% else %}
<div class="row">{{ item }}</div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
</div>
{% endmacro %}
Jak używać makra
Proste dane (stringi)
{% import "macros.html" as ui %}
{{ ui.multi_columns(dane, 3) }}Dane obiektowe (np. nazwa, opis, stan)
{% import "macros.html" as ui %}
{% call(item) ui.multi_columns(dane, 3) %}
<div class="row">
<strong>{{ item.nazwa }}</strong><br>
{{ item.opis }}<br>
Stan lodowy: {{ item.stan }}
</div>
{% endcall %}