2008-11-07 23 views
44

Trong views.py của tôi, tôi đang tạo danh sách hai bộ, trong đó mục thứ hai trong tuple là một danh sách khác, như sau:Django - Cách thực hiện giải nén tuple trong một mẫu 'for' loop

[ Product_Type_1, [ product_1, product_2 ], 
    Product_Type_2, [ product_3, product_4 ]] 

trong Python cũ đồng bằng, tôi có thể lặp đi lặp lại trong danh sách như thế này:

for product_type, products in list: 
    print product_type 
    for product in products: 
     print product 

tôi dường như không thể làm điều tương tự trong mẫu Django của tôi:

{% for product_type, products in product_list %} 
    print product_type 
    {% for product in products %} 
     print product 
    {% endfor %} 
{% endfor %} 

Tôi nhận được lỗi này từ Django:

Caught một ngoại lệ khi render: zip luận # 2 phải hỗ trợ lặp

Tất nhiên, có một số đánh dấu HTML trong mẫu, không in báo cáo. Tuple giải nén không được hỗ trợ trong ngôn ngữ mẫu Django? Hoặc tôi đang đi về điều này một cách sai lầm? Tất cả những gì tôi đang cố gắng làm là hiển thị một hệ thống các đối tượng đơn giản - có một số loại sản phẩm, mỗi loại có một số sản phẩm (trong models.py, Sản phẩm có khóa ngoài là Product_type, một mối quan hệ một-nhiều).

Rõ ràng, tôi khá mới đối với Django, vì vậy mọi đầu vào đều sẽ được đánh giá cao.

+2

Bạn nói về tuples, nhưng câu hỏi của bạn chỉ chứa các danh sách. Chúng là những thứ khác nhau trong python. –

+0

Bạn thực sự không có hai bộ dữ liệu. Xem kỹ danh sách của bạn, bạn có 4 mục danh sách. Như Jonny Buchanan đã lưu ý, bạn cần làm điều này: [[Product_Type_1, [product_1, product_2],], [Product_Type_2, [product_3, product_4],],] để nhận phiên bản danh sách hai bộ. – MontyThreeCard

Trả lời

53

nó sẽ là tốt nhất nếu bạn xây dựng dữ liệu của bạn như {lưu ý '(' và ')' có thể được trao đổi cho '[' và ']' repectively, một là cho các bộ, một cho danh sách}

[ (Product_Type_1, (product_1, product_2)), 
    (Product_Type_2, (product_3, product_4)) ] 

và có mẫu làm điều này:

{% for product_type, products in product_type_list %} 
    {{ product_type }} 
    {% for product in products %} 
     {{ product }} 
    {% endfor %} 
{% endfor %} 

cách tuples/danh sách được giải nén trong vòng lặp for được dựa trên mục trả về bởi danh sách các iterator. mỗi lần lặp lại chỉ một mục được trả về. lần đầu tiên xung quanh vòng lặp, Product_Type_1, thứ hai danh sách các sản phẩm ...

+1

tức là bạn nghĩ rằng bạn đang xây dựng một danh sách hai bộ, nhưng bạn đã quên phần tuple - lưu ý các dấu ngoặc đơn phụ xung quanh cặp danh sách sản phẩm/sản phẩm trong câu trả lời của Cipher –

+0

Điều này không hoạt động đối với các phiên bản Django cũ hơn (như đã sử dụng) trong GAE). Sử dụng câu trả lời của Ashwin Rao nếu bạn gặp lỗi này: "'for' statement với năm từ nên kết thúc bằng 'reversed'" –

2

Chỉ cần gửi mẫu một danh sách các loại sản phẩm và làm điều gì đó như:

{% for product_type in product_type_list %} 
    {{ product_type }} 
    {% for product in product_type.products.all %} 
     {{ product }} 
    {% endfor %} 
{% endfor %} 

Nó được một thời gian ngắn vì vậy tôi không thể nhớ chính xác những gì các cú pháp là, cho tôi biết nếu mà làm việc. Kiểm tra số documentation.

+0

+1: không quá trình trong chế độ xem –

+0

Chris Lawlor đã không giải thích làm thế nào anh ta kết thúc với cấu trúc dữ liệu anh ta có (danh sách này không thực sự là hai bộ), nhưng cách tiếp cận được đề xuất này sẽ dẫn đến N + 1 truy vấn để hiển thị danh sách sản phẩm. –

+0

Đây là con rồng. Sử dụng gợi ý này, bạn đang thực hiện một chuyến đi riêng đến cơ sở dữ liệu cho từng product_type. Tôi nghi ngờ rằng việc giảm thiểu tải cơ sở dữ liệu có lẽ là động lực đằng sau việc sử dụng bộ dữ liệu ngay từ đầu. – btubbs

5

Bạn phải sử dụng theo cách này:

{% for product_type, products in product_list.items %} 
    print product_type 
    {% for product in products %} 
     print product 
    {% endfor %} 
{% endfor %} 

Đừng quên các mục biến trong các dữ liệu từ điển

+0

Cuối cùng, câu trả lời tôi đang tìm kiếm. Cảm ơn bạn! – Teekin

57

Một cách khác là như sau.

Nếu ta có một danh sách các hàng nói

mylst = [(a, b, c), (x, y, z), (l, m, n)], 

sau đó người ta có thể giải nén danh sách này trong mẫu tập tin theo cách sau đây. Trong trường hợp của tôi, tôi có một danh sách các bộ chứa URL, tiêu đề và bản tóm tắt của một tài liệu.

{\% for item in mylst \%}  
    {{ item.0 }} {{ item.1}} {{ item.2 }}  
{\% endfor \%} 
+0

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn. – mlsteeves

+4

'.0' ... không trực quan chút nào. –

+0

@iuliux lừa là hãy nhớ rằng ngôn ngữ mẫu làm cho '.' có nghĩa là bất cứ điều gì từ truy cập biến để đăng ký, đi qua lời gọi phương thức, tất cả với cùng cú pháp ... Vẫn đồng ý với bạn, tho :) – mccc

1

Nếu bạn có số cố định trong bộ dữ liệu, bạn chỉ có thể sử dụng lập chỉ mục.Tôi cần thiết để trộn một cuốn từ điển và các giá trị được các bộ, vì vậy tôi đã làm điều này:

Trong giao diện:

my_dict = {'parrot': ('dead', 'stone'), 'lumberjack': ('sleep_all_night', 'work_all_day')} 

Trong mẫu:

<select> 
    {% for key, tuple in my_dict.items %} 
    <option value="{{ key }}" important-attr="{{ tuple.0 }}">{{ tuple.1 }}</option> 
    {% endfor %} 
</select> 
Các vấn đề liên quan