2013-07-30 2 views
5

내 문맥에 단일 목록 my_list이 있는데 첫 번째 열의 첫 번째 (n + 1)/2 항목과 두 개의 "열"로 렌더링하고 싶습니다. 두 번째 열의 마지막 n/2 항목 장고 템플릿 태그/필터를 사용하여이 작업을 수행 할 수있는 간단한 방법이 있습니까? 아니면 내 뷰에서 목록을 두 개로 미리 분할해야합니까? 예를 들어,Django 템플릿 태그로 목록 나누기

,

<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

균일 한 청크로 분할 (http://djangosnippets.org/snippets/660/) 여기 templatetag이다]. 사용법'{% split_list my_list as chunked_data 2 %}' – karthikr

답변

7

더 많은 '장고'방법은 당신이 가능한 템플릿에서 많은 논리를 유지하기로 한,보기에 그것을 할 것입니다. 즉, 템플릿을 통해이를 수행 할 수있는 방법이 있습니다.

얼마나 많은 사용자가 목록에 있는지 알고있는 경우 slice template tag을 사용할 수 있습니다. 당신이하지 않는다고 가정 해 봅시다.

다른 방법은 두 번 반복하여 원하는 절반 만 표시하는 것입니다. 매번 목록을 보게 될 것이므로 값 비쌉니다. 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

나는 비슷한 것을 말하려고하고있다. (장고의 관점에서 볼 때 더 장고적인 방법으로 말하고 싶다.) 반면에 실제로는 그렇지 않다. 논리를 표시 하시겠습니까? Django가 템플릿에서 수행해야하는 작업은? –

+1

좋은 지적. 디스플레이인지 아닌지에 관계없이 항상 템플릿에서 많은 로직을 유지하려고했습니다. 당신은 훨씬 더 많은 권력을 얻었고, 그 템플릿은 너무 제한적입니다. – JcKelley

+1

전적으로보기에서보기가 더 쉬울 것입니다. 너무 나쁘다. 정말로 템플릿 언어가 너무 제한적이다. 때때로 디스플레이 로직은 실제 로직을 필요로합니다. –

1

A (약간 해키) 방법은 목록의 중심과 임시 변수를 만들 수있는 와 템플릿 태그를 해결하기 위해 템플릿 태그 widthratio 을 사용하는 것입니다.

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