2016-08-09 118 views
0

Ich brauche wie unten eine benutzerdefinierte Tabelle in django Vorlage zu erstellen:Erstellen von benutzerdefinierter Tabelle in djnago Vorlage forloop

<table> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
    </tr> 
</table> 

das heißt ich neuen tr Tag nach jeweils 3 td-Tags hinzufügen möge. Ich habe versucht, Logik mit {{forloop.counter | divisibleby: 4}} anzuwenden. Ich habe etwas wie unten versucht, aber es hat nicht die gewünschten Ergebnisse erzeugt.

{% for items in range(5) %} 
    {% if forloop.counter ==1 or forloop.counter|divisibleby:4 %}\ 
    <tr> 
    {% endif %} 
    <td>name</td> 

    {% if forloop.counter|divisibleby:4 %} 
     </tr> 
    {% endif %} 
    </tr> 
{% endfor %} 

aber es ist offensichtlich nicht die richtige Lösung. Update: Es erzeugt so etwas wie unten: Output Wenn jedes Bild-Tag

+0

können Sie einen Screenshot hinzu, was die Ausgabe sieht derzeit wie und tun eine manuelle Mockup von dem, was Sie wollen, dass es aussehen.Dies wird mir helfen, zu sehen, was Sie erreichen möchten – nkhumphreys

+0

@nkhumphreys Ich habe ein Bild für die Ausgabe, die ich bekomme. – Simer

+0

ist ein Bereich ein benutzerdefiniertes Template-Tag? – nkhumphreys

Antwort

1

td Dieser Teil wird auf true Auswertung ist nicht für die richtigen Zahlen:

{% if forloop.counter ==1 or forloop.counter|divisibleby:4 %} 

Das wird den Wert true wenn der Zähler 1, 4, 8, 12 usw. ist. Nicht alle 3 Ziffern, sondern alle vier Ziffern. Verwenden Sie stattdessen forloop.counter0, etwa so:

{% if forloop.counter0 | divisibleby: 3%}

forloop.counter0 beginnt bei 0, so dass es werde von 3 auf 0 teilbar ist, 3, 6, 9, usw. wie du willst.

Es gibt ein weiteres Problem mit dem Code hier:

{% if forloop.counter|divisibleby:4 %} 
    </tr> 
{% endif %} 
</tr> 

Wenn Sie nur wollen, dass der Tag nach jedem dritten Element geschlossen werden, dann die, außerhalb der, wenn die Bedingung entfernen. Außerdem fügen Sie das schließende Tag in die falschen Teile ein. Es soll ein Element sein, bevor Sie den Tag wieder öffnen, so am dritten Element, 6. Element usw. Dazu Sie noch die forloop.counter wie so verwenden können:

{% if forloop.counter|divisibleby:3 %} 
    </tr> 
{% endif %} 

Gesamt, sollte Ihr Code aussehen dies:

{% for items in range(5) %} 
    {% if forloop.counter0|divisibleby:3 %} 
     <tr> 
    {% endif %} 
    <td>name</td> 
    {% if forloop.counter|divisibleby:3 %} 
     </tr> 
    {% endif %} 
{% endfor %} 
</tr> 

Wenn Sie eine unbekannte nbr Anzahl der Elemente statt 5 verwenden, ersetzen Sie einfach die </tr> Tag außerhalb des forloop für

{% if not nbr|divisibleby:3 %} 
    </tr> 
{% endif %} 

so dass Sie nicht zwei </tr> s haben, wenn man bei der letzten Wiederholung der for-Schleife hinzugefügt wurde.

+0

@Simer Ich habe am Ende eine Notiz hinzugefügt, wenn Sie eine variable Anzahl von Elementen verwenden – dietbacon

+0

Was ist 'nbr' in Ihrer Lösung? – Simer

+1

@Simer Gesamtzahl der Elemente. Wenn Sie also '{% für Elemente im Bereich (nbr)%}' verwenden, verwenden Sie dieses Stück am Ende anstatt nur ''. oder wenn Sie '{% for items in my_queryset%}' anstelle von range verwenden, ersetzen Sie einfach 'nbr' für 'my_queryset.count' – dietbacon

1

So ist dies, weil Sie <tr> UND </tr> einfügen, wenn der forloop Zähler durch 4 teilbar ist, werden Sie auch <tr> wenn der forloop Zähler 1. So ist die erste Zeile Arbeiten eingesetzt wird, die zweite Reihe das Öffnen und Schließen wird einfügen Tags (weil der Forloop-Zähler immer noch durch 4 teilbar ist). Deine Logik ist ausgeschaltet.

Ich glaube, Sie wollen:

<table> {% for items in range(5) %} {% if forloop.counter == 1 %} <tr> {% endif %} <td>name</td> {% if forloop.counter|divisibleby:4 %} </tr><tr> {% endif %} {% endfor %} </tr> </table>

+0

Vielen Dank für Ihre Lösung @nkhumphreys. Ich werde das auch versuchen. Für jetzt habe ich Lösung von Diätbacon gewählt, wie es scheint, ein bisschen einfacher und optimiert. Danke für Ihr Bemühen. – Simer

+1

Yeh dietbacon's Lösung ist gut. Ich denke nicht, dass es besonders wichtig ist, ob du deinen Index bei 1 oder 0 beginnst. Ich bin Purist und ziehe es vor, bei 0 zu beginnen, aber ich wollte die Antwort nicht verwirren. Die wichtige Sache ist, die Logik dafür zu bekommen, wo man die Umbauten richtig einfügt – nkhumphreys

+0

@nkhumphreys Diese Lösung ist in Ordnung. Es funktioniert gut für 5 Elemente, aber es bricht, wenn Sie mehr als 7 Elemente haben, da es beginnt, die Elemente 4 durch 4 zu teilen. – dietbacon