2013-07-30 13 views
5

Tôi có một danh sách duy nhất my_list trong ngữ cảnh của mình và tôi muốn hiển thị nó dưới dạng hai cột "", với mục đầu tiên (n + 1)/2 trong cột đầu tiên và n/2 mục cuối cùng trong cột thứ hai. Có một cách thẳng về phía trước để làm điều này với thẻ django mẫu/bộ lọc hoặc tôi cần phải phân chia trước danh sách thành hai trong quan điểm của tôi?Tách danh sách bằng thẻ mẫu django

ví dụ

<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

[Đây là templatetag] (http://djangosnippets.org/snippets/660/) để chia thành các phần đồng nhất. Cách sử dụng '{% split_list my_list dưới dạng chunked_data 2%}' – karthikr

Trả lời

7

Càng cách 'Django' sẽ làm điều đó trong giao diện, như bạn có nghĩa vụ phải giữ càng nhiều logic trên mẫu của bạn càng tốt. Điều đó đang được nói, có một cách bạn có thể làm điều đó thông qua các mẫu.

Bạn có thể sử dụng số slice template tag nếu bạn đã biết có bao nhiêu trong danh sách. Hãy giả sử bạn không mặc dù.

Phương pháp khác sẽ chỉ lặp lại hai lần và chỉ hiển thị một nửa bạn muốn. Bạn sẽ đi qua toàn bộ danh sách mặc dù mỗi lần, do đó, nó có thể tốn kém. Nó sử dụng 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

Tôi sắp nói một điều tương tự (liên quan đến nó là cách Django hơn để làm điều đó trong chế độ xem), nhưng mặt khác, không phải là thực sự logic hiển thị? Django nói _should_ được thực hiện trong mẫu. –

+1

Điểm tốt. Tôi đã luôn luôn cố gắng để giữ cho logic nhiều ra khỏi mẫu bất kể nếu nó được hiển thị hay không. Bạn được cung cấp nhiều quyền lực hơn, mẫu chỉ rất hạn chế. – JcKelley

+1

Nó hoàn toàn là, nó sẽ được dễ dàng hơn nhiều để làm điều đó trong xem. Nó quá tệ, thực sự, ngôn ngữ mẫu rất hạn chế. Đôi khi logic hiển thị yêu cầu logic thực tế. –

1

A (hơi hacky) cách để làm điều này hoàn toàn trong mẫu là sử dụng widthratio mẫu thẻ để làm việc ra các trung tâm của danh sách và với mẫu thẻ để tạo ra các biến tạm thời.

{% 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>