2016-07-15 4 views
0

私のDjangoテンプレートのリストを反復するとき、最後のアイテムの 'type'値が現在の値と等しい場合、 itemのループの 'type'値に含まれていますが、そのためのPython構文はDjangoテンプレートでは許可されていないようです。私は{{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

私の知る限り、Djangoのテンプレート構文は '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

ああ、組み込みのテンプレートタグの力。ダニエルありがとう、これは私が達成しようとしていたものとまったく同じでした。 – JBT

+0

これは、変数の_タイプ_が変更されたかどうかをチェックします。重要な違い。 – Justin

+1

これは正しいとは思わない。 'ifchanged'は変数の' value'が変更されても 'True'を返しますが、OPがチェックしようとしていたのは変数の' type'です –

1

あなたのコードで複数の問題があります。

Justinで示されているように、Djangoテンプレートでは、list[index]のようなものを使用してリスト要素にアクセスすることはできません。代わりにする必要がありますlist.index

Djangoテンプレートエンジンは、変数の型を決定する方法がありません。テンプレートフィルタを実装して、それを使用して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テンプレートタグを作成することによってこれを行うことができることですべき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 %} 
関連する問題