2016-11-12 3 views
0

Ich versuche Django zu lernen, aber ich brauche Hilfe, weil ich Probleme habe zu verstehen.Wie Template-Tag verwenden, um durch vieleTomanny Modell zu iterieren?

Wie kann ich durch alle meine Modelle iterieren, ohne für jede Ebene der Aufgaben, die ich habe, für Schleifen zu schreiben?

Beispiel, aber ich mag unendliche Teilaufgaben:

  1. Aufgabe # 1

    1.1 Subtask # 1

    1.2 Subtask # 2

    1.2.1 Subsubtask # 3

  2. Aufgabe # 2

    2.1 Unteraufgabe # 4

    .

    .

    .

    .

Mein Modell viele zu viele Feld auf sich selbst

class task(models.Model): 

    name = models.CharField(max_length=100) 

    notes = models.TextField() 

    created = models.DateTimeField() 

    created_by = models.ForeignKey(User) 

    subtask = models.ManyToManyField('self') 

Meine Vorlage

{% for task in items %} 
<li>{{ task.name }} 
    <ul> 

    {% for subtask in task.subtask.all %} 
     <li>{{ subtask.name }}</li> 
    {% endfor %} 
    </ul> 
</li> 
{% endfor %} 

Wie kann ich ein Template-Tag für Schlaufe Aufgaben

Antwort

1

Sie sollten bis unendlich Verwenden Sie eine Form der Rekursion. Django hat die rekursive Verwendung des include Template-Tag erlauben (wie in diesem answer beschrieben):

# tasks.html 

{% if items %} 
    <ul> 
    {% for task in items %} 
     <li> 
     {{ task.name }} 
     {# recursively include template itself #} 
     {% with items=task.subtask.all template_name="tasks.html" %} 
      {% include template_name %} 
     </li> 
    {% endfor %} 
    </ul> 
{% endif %} 

Jetzt können Sie "tasks.html" in jeder anderen Vorlage enthalten:

{% include "tasks.html" with items=items %} 

Es ist wahrscheinlich besser, die Praxis umzusetzen ein benutzerdefiniertes Tag, und verschieben Sie den rekursiven Code aus der Vorlage, aber das Prinzip bleibt gleich. Eine andere Anmerkung, Ihre aktuelle Modellstruktur verhindert nicht, dass Ihr Aufgabengraph kreisförmig ist: wenn z. Zwei Aufgaben sind die Teilaufgaben des jeweils anderen, Sie enden mit unendlicher Rekursion.

+0

Guter Punkt auf den kreisförmigen Teilaufgaben. Warum ist es besser, ein benutzerdefiniertes Tag zu implementieren, als das mit zu verwenden? – TanyaG

+0

Die Verwendung von "' with' "ist bereits eine Art von Kung-Fu, die verhindert, dass der Template-Compiler unendlich rekursiv ist ... Darüber hinaus ist Python eine mächtigere Sprache als die Django-Templating-Sprache, macht es also leichter (oder überhaupt möglich, eine ernsthafte Logik zu implementieren, sa Verhinderung einer unendlichen Rekursion durch z.B. Sammeln von besuchten Aufgaben oder ähnlichem. – schwobaseggl

Verwandte Themen