2011-01-19 17 views
9

Przekazuję dwie listy do szablonu. Normalnie jakbym iteracji na liście chciałbym zrobić coś takiegoLicznik Django w pętli do indeksu listy

{% for i in list %} 

ale mam dwie listy, że muszę przejść równolegle, tzn. n-ty element na jednej liście odpowiada n-tej pozycji z drugiej listy. Moją myślą było zapętlić jedną listę i uzyskać dostęp do elementu z drugiej listy za pomocą forloop.counter0, ale nie mogę znaleźć składni, aby to działało.

Dzięki

Odpowiedz

13

Nie możesz. Prostym sposobem jest Preprocesuj wy dane w zipped list, podobnie jak to

W widoku

x = [1, 2, 3] 
y = [4, 5, 6] 
zipped = zip(x, y) 

Następnie w ty Szablon:

{% for x, y in zipped %} 
    {{ x }} - {{ y }} 
{% endfor %} 
+0

czy uważasz, że jest to lepsze rozwiązanie niż użycie multikina? Z pewnością podoba mi się, że jest to prostszy szablon – JPC

0

nie sądzę, że będziesz w stanie to zrobić. Będziesz potrzebował albo znacznika szablonu, albo znacznie lepiej, aby wyrównać listy w logice widoku, przed przekazaniem wyrównanej struktury danych do szablonu.

5

Brzmi jak szukasz moim django-multiforloop. Od README:

Rendering ten szablon

{% load multifor %} 
{% for x in x_list; y in y_list %} 
    {{ x }}:{{ y }} 
{% endfor %} 

z tym kontekście

context = { 
    "x_list": ('one', 1, 'carrot'), 
    "y_list": ('two', 2, 'orange') 
} 

wyjście wola

one:two 
1:2 
carrot:orange 
6

skończyło się to zrobić:

{% for x in x_list %} 
    {% for y in y_list %} 
    {% if forloop.counter == forloop.parentloop.counter %} 
     Do Something 
    {% endif %} 
    {% endfor %} 
{% endfor %} 
+0

Myślę, że jest to rozwiązanie "O (n^2)", kiedy można to zrobić w prosty sposób "O (n)". – Pant

9

Aby uzyskać dostęp do iterowalny za pomocą licznika forloop mam zakodowaną następujący bardzo prosty filtr:

from django import template 

register = template.Library() 

@register.filter 
def index(sequence, position): 
    return sequence[position] 

I wtedy można go używać w moich szablonów jako (nie zapomnij, aby go załadować):

{% for item in iterable1 %} 
    {{ iterable2|index:forloop.counter0 }} 
{% endfor %} 

Mam nadzieję, że to pomoże komuś innemu!

+0

To, mimo że wykonanie kilku dodatkowych kroków do implementacji, pozwala na użycie zmiennych 'forloop.counter0' dla pętli. Zmieniłem instrukcję return na: 'return sequence [position]' dla moich potrzeb. – Flash

+1

@Flash Używam 'sequence [position]' również w moim prawdziwym kodzie, zaktualizowałem tutaj! – Caumons

Powiązane problemy