2016-09-10 17 views
2

私はリスト "foos"を持っています。もし私が5つ以上の "foos"を持っていれば、最初の2つのものに特化したものを作り、残りのものには特定のものをしたい。Jinja2高度なスライシングを行う方法

は、だから私はちょっとHTMLでこのような何かをしたい:

<div id="accordion"> 
    <p>Foo1<p> 
    <p>Foo2<p> 
    <div id="collapseMe" class="panel-collapse collapse"> 
     <p>Foo3<p> 
     <p>Foo4<p> 
     etc... 
    </div> 
</div> 

<a data-parent="#accordion" href="#collapseMe"><p>Expand</p></a> 

だから、私はちょっとJinga2でこれを解決してきましたが、解決策は非常に醜いです。私は何かが欠けているのだろうかと思っていますか?

<div id="accordion"> 
    {% for f in foos %} 
     {% if loop.index <= 2 %} 
      <p>{{ f.txt }}</p> 
     {% else %} 
      {% if loop.index == 3 %} 
       <div id="collapseMe" class="panel-collapse collapse"> 
        <p>{{ f.txt }}</p> 
      {% else %} 
        <p>{{ f.txt }}</p> 
      {% endif %} 
     {% endif %} 
    {% endfor %} 

    {% if foos | length > 2 %} 
    </div> 
    <a data-parent="#accordion" href="#collapseMe"><p>Expand</p></a> 
    {% endif %} 
</div> 

これは機能しますが、これを行うにはより良い方法が必要だと思います。残念ながら、スライス機能はJinga2ではかなり制限されていますが、私がまだ拾っていない別の方法がありますか?バッチ機能の仕組みについては完全にはっきりしていませんが、それはうまくいくでしょうか?

答えて

1

forループの前にfoosリストをプレスライスするフィルタを作成するか、検索することができます。

{% for f in foos|slice:"0:10:2" %} 

あなたは、フィルタ自体にロジックをループテンプレートのほとんどを移動したり、簡単なルートを行くと、リスト上の既存のスライス表記を使用することもできます。他に

from jinja2 import Environment, Undefined 

def slice(iterable, pattern): 
    if iterable is None or isinstance(iterable, Undefined): 
     return iterable 

    # convert to list so we can slice 
    items = list(iterable) 

    start = None 
    end = None 
    stride = None 

    # split pattern into slice components 
    if pattern: 
     tokens = pattern.split(':') 
     if len(tokens) >= 1: 
      start = tokens[0] 
     if len(tokens) >= 2: 
      end = tokens[1] 
     if len(tokens) >= 3: 
      stride = tokens[2]; 

    return items[start:end:stride] 

どこかで、あなたのJinja2のにフィルタを追加します環境。 [:::][None:None:None]が同じスライス表記であるため、これが動作すること

env = Environment() 
env.filters['slice'] = slice 

注意。

+0

私は解決策が気に入っていますが、それは上記より優れていますか?私はあなたのポイントは、テンプレートから潜在的に複雑なプロセスを引き出して、代わりにコードに入れる方が良いと考えていますか? – edumike

+0

@edumike;これにより、メインテンプレートが読みやすくなり、スライスフィルタは他の場所で再利用できます。あなたがカスタムテンプレートグラフではなく簡潔なコードで作業をしているので、速度優位性が最も高いでしょう。 – Soviut

関連する問題