2011-01-19 74 views
9

Tôi đang chuyển hai danh sách vào một mẫu. Thông thường, nếu tôi đang lặp qua danh sách, tôi sẽ làm điều gì đó như thế nàyTruy cập Django trong danh sách chỉ số vòng lặp

{% for i in list %} 

nhưng tôi có hai danh sách mà tôi cần truy cập song song, tức là. mục thứ n trong một danh sách tương ứng với mục thứ n trong danh sách khác. Suy nghĩ của tôi là để lặp qua một danh sách và truy cập một mục trong danh sách khác bằng cách sử dụng forloop.counter0 nhưng tôi không thể tìm ra cú pháp để có được điều đó để làm việc.

Cảm ơn

Trả lời

13

Bạn không thể. Cách đơn giản là để preprocess bạn dữ liệu trong một zipped list, như thế này

Theo quan điểm của bạn

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

Sau đó, trong bạn template:

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

bạn có nghĩ rằng đây là giải pháp tốt hơn so với sử dụng đa điểm không? Tôi chắc chắn như vậy là kết quả trong một mẫu đơn giản hơn – JPC

0

đừng nghĩ rằng bạn sẽ có thể làm điều đó như vậy. Bạn sẽ cần thẻ mẫu hoặc tốt hơn nhiều, để căn chỉnh các danh sách trong logic chế độ xem của bạn, trước khi chuyển cấu trúc dữ liệu được căn chỉnh cho mẫu của bạn.

5

Âm thanh như bạn đang tìm kiếm django-multiforloop tôi. Từ README:

Rendering mẫu

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

này với bối cảnh này

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

chí đầu ra

one:two 
1:2 
carrot:orange 
6

tôi đã kết thúc cần phải làm điều này:

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

Tôi nghĩ rằng đó là một giải pháp 'O (n^2)' khi bạn có thể làm điều đó chỉ đơn giản là 'O (n)'. – Pant

9

Để truy cập vào một iterable sử dụng một forloop quầy Tôi đã được mã hóa bộ lọc rất đơn giản sau đây:

from django import template 

register = template.Library() 

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

Và sau đó tôi có thể sử dụng nó ở mẫu của tôi như là (đừng quên để tải nó):

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

Hy vọng điều này sẽ giúp người khác!

+0

Điều này, mặc dù thực hiện thêm một vài bước để triển khai, cho phép sử dụng 'forloop.counter0' sẽ cung cấp các biến cho các vòng lặp. Tôi đã thay đổi câu lệnh return thành: 'return sequence [position]' cho các nhu cầu của tôi. – Flash

+1

@Flash Tôi thực sự đang sử dụng 'chuỗi [vị trí]' trong mã thực của tôi, cập nhật tại đây! – Caumons

Các vấn đề liên quan