2016-07-15 6 views
0

내 장고 템플릿 중 하나에서 목록을 반복 할 때 '만약 마지막 항목의'값 '값이 현재와 같은 경우'논리를 말할 것입니다. 항목의 'type'값을 루프하지만 그 일을위한 파이썬 구문이 장고 템플릿에서 허용되지 않는 것 같습니다. {{forloop.counter}}를 사용할 수는 있지만 해당 목록을 사용하여 특정 색인의 항목을 가져올 수는 없습니다.Django - django 템플릿 iterable에서 항목을 가져 오기

HTML

{% for repair in repairs %} 
    {% if repairs[{{ forloop.counter - 1}}].type == repair.type %}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endif %} 
    <div class="col-sm-6"> 
     <label> 
      <input type="checkbox" name="{{ repair }}"> 
     {{ repair }}</label> 
    </div> 
{% endfor %} 

또는 코드 여러 문제가 있습니다 또한

{% for index, repair in enumerate(repairs) %} 
    {% if repairs[index - 1].type == repair.type%}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endif %} 
    <div class="col-sm-6"> 
     <label> 
      <input type="checkbox" name="{{ repair }}"> 
     {{ repair }}</label> 
    </div> 
{% endfor %} 
+1

/1.9/howto/custom-template-tags/ –

+1

내가 아는 한, 장고의 템플릿 구문은'list [index]'를 지원하지 않고'list.index'를 대신 지원합니다. – Justin

답변

1

이 경우 ifchanged을 사용할 수 있습니다.

{% for repair in repairs %} 
    {% ifchanged repair.type %}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endifchanged %} 
    ... 
{% endfor %} 
+0

Ahhh 내장 템플릿 태그의 힘. 다니엘 감사합니다, 내가 정확히 달성하려고 노력했다. – JBT

+0

변수의 _ 유형 _이 변경된 것이 아니라 변수의 _value_가 변경되었는지 확인합니다. 중요한 차이점. – Justin

+1

이것이 맞는 것 같지 않습니다. 'ifchanged'는 변수의'value'가 변경 되더라도'True'를 반환 할 것입니다. OP가 검사하려고 시도한 것은 –

1

.

Justin으로 표시된 바와 같이 Django 템플릿을 사용하면 list[index]과 같은 것을 사용하여 목록 요소에 액세스 할 수 없습니다. 대신해야 할 일 list.index

장고 템플릿 엔진은 변수의 유형을 결정할 방법이 없습니다. 템플릿 필터를 구현하고이를 사용하여 this 답변에 설명 된대로 변수 유형을 결정할 수 있습니다.

또한 {{ forloop.counter - 1}} 대신 {{ forloop.counter0 - 1}}을 사용해야합니다. forloop.counter은 루프의 1- 색인 반복을 제공하지만 forloop.counter0은 루프의 0- 인덱싱 반복을 제공합니다.

그래서 최종 코드의 모양은 다음과 같습니다

from django import template 

register = template.Library() 

@register.filter 
def get_type(value): 
    return type(value) 

{% for repair in repairs %} 
    {% if repairs.{{ forloop.counter0 - 1}}|get_type == repair|get_type %} 
     <div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"> 
      <h2>{{ repair|get_type }}</h2> 
     </div> 
    {% endif %} 
    <div class="col-sm-6"> 
     <label> 
      <input type="checkbox" name="{{ repair }}"> 
       {{ repair }} 
     </label> 
    </div> 
{% endfor %} 

편집 : 당신은 '유형'실제로 변수의 속성이다, 여기에 코드가 있어야한다 무엇을 명확히 한 후 :

{% for repair in repairs %} 
    {% if repairs.{{ forloop.counter0 - 1}}.type == repair.type %} 
     <div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"> 
      <h2>{{ repair.type }}</h2> 
     </div> 
    {% endif %} 
    <div class="col-sm-6"> 
     <label> 
      <input type="checkbox" name="{{ repair }}"> 
       {{ repair }} 
     </label> 
    </div> 
{% endfor %} 

물론 Daniel이 제안한 방법이이를 수행하는 더 좋은 방법입니다.

0

귀하의 사용 사례에 대한 내장 템플릿 태그가 있습니다 당신은 https://docs.djangoproject.com/en 템플릿 태그를 생성하여이 작업을 수행 할 수 BY해야 regroup

{% regroup repairs by type as types %} 
{% for type in types %} 
    <div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ type.grouper}}</h2></div> 
    {% for repair in type.list %} 
     <div class="col-sm-6"> 
      <label> 
       <input type="checkbox" name="{{ repair }}">{{ repair }} 
      </label> 
     </div> 
    {% endfor %} 
{% endfor %}