2013-07-30 20 views
5

Mam pojedynczą listę my_list w moim kontekście i chciałbym ją uczynić jako dwie "kolumny", z pierwszą (n + 1)/2 pozycją w pierwszej kolumnie i ostatnie pozycje n/2 w drugiej kolumnie. Czy istnieje prosty sposób, aby to zrobić za pomocą tagów/filtrów szablonów django, czy też muszę wstępnie podzielić tę listę na dwie w moim widoku?Dzielenie listy znacznikami szablonu django

np

<div class="split-50-left"> 
    <ul> 
    {% for item in [first half of my_list] %} 
     <li>{{item}}</li> 
    {% endfor %} 
    </ul> 
</div> 
<div class="split-50-right"> 
    <ul> 
    {% for item in [second half of my_list] %} 
     <li>{{item}}</li> 
    {% endfor %} 
    </ul> 
</div> 
+0

[Tutaj jest templatetag] (http://djangosnippets.org/snippets/660/), aby podzielić je na jednolite kawałki. Użycie '{% split_list moja_lista jako chunked_data 2%}' – karthikr

Odpowiedz

7

Bardziej sposób 'Django byłoby to zrobić w widoku, jak mają zachować jak najwięcej logiki z szablonu, jak to możliwe. Biorąc to pod uwagę, istnieją sposoby, dzięki którym można to zrobić za pomocą szablonu.

Możesz użyć slice template tag, jeśli wiesz już, ile osób znajduje się na liście. Załóżmy, że tak nie jest.

Inną metodą byłoby po prostu pętli nad nim dwa razy, i wyświetla tylko połowę chcesz. Przeszukasz całą listę całą za każdym razem, więc może być kosztowna. Korzysta z forloop counter.

{% for item in items %} 
#half list is calculated in your view. It is the items query /2 
    {% if forloop.counter < half_list %} 
     {% item.name %} 
    {% endif %} 
{% endfor %} 

{% for item in items %} 
#half list is calculated in your view. It is the items query /2 
    {% if forloop.counter >= half_list %} 
     {% item.name %} 
    {% endif %} 
{% endfor %} 
+0

Chciałem powiedzieć coś podobnego (jeśli chodzi o to, że jest to bardziej metoda Django), ale z drugiej strony, czy to nie jest tak naprawdę? wyświetlać logikę? Które Django mówi, że powinno być zrobione w szablonie. –

+1

Dobra uwaga. Zawsze próbowałem zachować logikę z szablonu niezależnie od tego, czy jest wyświetlany, czy nie. Dostajesz znacznie więcej mocy, szablon jest po prostu tak ograniczony. – JcKelley

+1

To całkowicie, byłoby o wiele łatwiej zrobić to w widoku. Szkoda, że ​​język szablonów jest tak ograniczony. Czasami logika wyświetlania wymaga rzeczywistej logiki. –

1

A (nieco hacky) sposób to zrobić wyłącznie w szablonie jest użycie widthratio szablonu tagu wypracować środek liście i z tag szablonu do tworzenia zmiennych tymczasowych.

{% widthratio form.visible_fields|length 2 1 as visible_fields_centre %} 
<div class="rows_form"> 
    {% with ":"|add:visible_fields_centre as first_slice %} 
     {% for field in form.visible_fields|slice:first_slice %} 
      {{ field }} 
     {% endfor %} 
    {% endwith %} 
</div> 
<div class="rows_form"> 
    {% with visible_fields_centre|add:":" as second_slice %} 
     {% for field in form.visible_fields|slice:second_slice %} 
      {{ field }} 
     {% endfor %} 
    {% endwith %} 
</div> 
Powiązane problemy