2013-07-30 10 views
5

Ich habe eine einzige Liste my_list in meinem Zusammenhang und ich möchte es als zwei „Säulen“ machen, mit dem ersten (n + 1)/2 Elementen in der ersten Spalte und die letzten n/2 Elemente in der zweiten Spalte. Gibt es eine direkte Möglichkeit, dies mit django Template-Tags/-Filtern zu tun, oder muss ich die Liste aus meiner Sicht in zwei teilen?Splitting eine Liste mit django Template-Tags

z.B.

<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

[Hier ist ein TemplateTag] (http://djangosnippets.org/snippets/660/), um in einheitliche Stücke zu teilen. Usage '{% split_list my_list als chunked_data 2%}' – karthikr

Antwort

7

Je mehr ‚Django‘, wie es in der Ansicht zu tun wäre, wie Sie sollen wie möglich aus Ihrer Vorlage so viel Logik halten. Davon abgesehen gibt es eine Möglichkeit, wie Sie es durch die Vorlage tun können.

können Sie die slice template tag verwenden, wenn Sie bereits wissen, wie viele in der Liste enthalten sind. Lass uns annehmen, dass du es nicht tust.

Die andere Methode, um nur eine Schleife über sie doppelt so hoch sein würde, und nur die Anzeige Hälfte Sie wollen. Sie würden über die gesamte Liste jedes Mal gehen, so könnte es teuer sein. Es verwendet die 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

Ich war über ähnliche, etwas zu sagen (in Bezug auf die es die mehr Django Weg, um es in der Ansicht zu sein tun), aber auf der anderen Seite, ist das nicht wirklich Anzeigelogik? Welche Django sagt _should_ in der Vorlage getan werden soll. –

+1

Guter Punkt. Ich habe immer versucht, so viel Logik aus der Vorlage herauszuhalten, egal ob sie angezeigt wird oder nicht. Du hast viel mehr Power, die Vorlage ist einfach so einschränkend. – JcKelley

+1

Es ist total, es wäre viel einfacher, es in der Ansicht zu tun. Es ist schade, dass die Vorlagensprache so einschränkend ist. Manchmal erfordert die Anzeigelogik tatsächliche Logik. –

1

A (leicht Hacky) Weg, dies ganz in der Vorlage zu tun ist, widthratio Template-Tag zu verwenden, um die Mitte der Liste zu erarbeiten und den mit Template-Tag temporäre Variablen zu erstellen.

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