2012-07-26 41 views
5

(tl; dr ở dưới cùng)Django, mẫu, vòng lặp và chu kỳ

Hãy để tôi giải thích những gì tôi đang cố gắng hoàn thành: Tôi có mảng hai chiều và tôi muốn hiển thị nội dung của nó theo một cách nào đó. Tôi muốn "hàng", và mỗi hàng có thể hiển thị không quá ba "đối tượng", vì thiếu một từ tốt hơn. Vì vậy, tôi muốn lặp qua mảng và tạo HTML của tôi trong quá trình này. Ý tưởng của tôi là: mỗi "đầu tiên của ba" yếu tố trong mảng nên mở ra "hàng". Mỗi phần tử "ba phần ba" phải đóng "hàng". Tuy nhiên, nếu phần tử cuối cùng trong mảng [bên trong] không xảy ra là "phần ba của ba", nó vẫn phải đóng hàng. Vì vậy, ví dụ, nếu chúng ta có một cái gì đó giống như L=[ [0,1,2,3,4], [5,6,7] ], tôi sẽ muốn hiển thị nó như vậy:

0 1 2 
3 4 

5 6 7 

Mà có thể được đánh dấu lên như:

<div>0 1 2</div> 
<div>3 4</div> 
<div>5 6 7</div> 

Suy nghĩ đầu tiên của tôi là chỉ cần sử dụng modulo toán tử và xem nếu mỗi lần lặp lại là "đầu tiên", "thứ hai", hoặc "thứ ba" của một hàng, nhưng các mẫu Django không trực tiếp hỗ trợ modulo (nhiều hơn về sau này).

Vì vậy, tôi đã đưa ra mẫu mã như thế này:

{% for x in L %} 
{% for y in x %} 
    {% cycle '<div>' '' '' %} 
    {{ y }} 
    {% cycle '' '' '</div>' %} 
{% endfor %}<br/> 
{% endfor %} 

Và đây là một khởi đầu tốt. Lấy ví dụ trên, trên 0 chúng tôi sẽ mở một div, trên 1 không làm gì, trên 2 đóng div, trên 3 mở nó và trên 4 ... tốt, nó sẽ không đóng, bởi vì 4 không phải là "thứ ba trong một loạt 3 ". Vì vậy, trong khi các mẫu Django không có modulo, chúng có kiểm tra divisibleby, vì vậy tôi đã đưa ra thêm logic để nói, nếu chúng ta nhấn phần tử cuối cùng của [inner] cho vòng lặp, và nó cũng không chia hết cho 3 (vì vậy chúng tôi không có bản sao đóng), sau đó đóng div:

{% for x in z %} 
{% for y in x %} 
    {% cycle '<div>' '' '' %} 
    {{ y }} 
    {% cycle '' '' '</div>' %} 

    {% if forloop.last %} 
    {% if forloop.counter|divisibleby:"3" %} 
    <!-- Row Already Closed --> 
    {% else %} 
    </div> 
    {% endif %} 
    {% endif %} 

{% endfor %}<br/> 
{% endfor %} 

Điều này làm việc tốt hơn! Bây giờ, tôi đã trải qua toàn bộ mảng bên trong đầu tiên với sự đánh dấu thích hợp. Vấn đề của tôi là điều này: rõ ràng, chức năng chu kỳ của Django không đặt lại khi bạn đi ra ngoài phạm vi của vòng lặp bên trong. Điều này có nghĩa là, số của tôi 5 từ ví dụ trên không mở một div như nó nên, nó không được công nhận là lần đầu tiên trong một chu kỳ. Trong thực tế, nó thực sự được công nhận là một phần ba, và vì vậy nó là đóng một div!

Vì vậy, tôi không chắc chắn nên đi đâu từ đây. Điều này có vẻ là known and unfixed issues in Django. Có ai giúp được không?

tl; dr Tôi muốn lấy mảng 2d, ví dụ: L=[ [0,1,2,3,4], [5,6,7] ] và đúng cách đánh dấu nó lên nhóm không quá 3 tại một thời điểm và không có nhóm bất kỳ yếu tố từ nhiều mảng với nhau, như vậy:

0 1 2 
3 4 

5 6 7 

Điều gì sẽ là các mẫu mã cho điều đó và tại sao?

Trả lời

14

Bạn sẽ có thể sử dụng {% if forloop.counter0|divisibleby:"3" %} để xác định thời điểm mở thẻ <div>{% if forloop.last or forloop.counter|divisibleby:"3" %} để xác định thời điểm đóng thẻ </div>.

{% for x in z %} 
{% for y in x %} 
    {% if forloop.counter0|divisibleby:"3" %}<div>{% endif %} 
    {{ y }} 
    {% if forloop.last or forloop.counter|divisibleby:"3" %}</div>{% endif %} 
{% endfor %}<br/> 
{% endfor %} 
+0

Hoàn hảo, cảm ơn! – Joseph

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