2016-11-12 41 views
0

我想學習Django,但我需要幫助,因爲我無法理解。如何使用模板標籤遍歷多個模型?

我如何通過我的所有車型的迭代,而無需編寫的,我有任務的各層次循環?

實施例但像無限子任務:

  1. 任務#1

    1.1子任務#1

    1.2子任務#2

    1.2.1 Subsubtask#3

  2. 任務#2

    2.1子任務#4

我的模型多對多場本身

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') 

我的模板

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

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

我如何使用模板標籤無窮大循環下來的任務

回答

1

你應該使用某種形式的遞歸。 Django的確實允許遞歸使用include模板標籤(如本answer描述):

# 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 %} 

現在,您可以在任何其他模板"tasks.html"

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

這可能是更好的做法來實現自定義標籤,並將遞歸代碼移出模板,但原理保持不變。另一方面,您當前的模型結構不會阻止您的任務圖形變爲圓形:如果兩個任務是彼此的子任務,你最終將無限遞歸。

+0

圓形子任務上的好點。爲什麼實現自定義標籤比使用with更好? – TanyaG

+0

「'with'」的使用已經是一種功夫,可以防止模板編譯器無限遞歸...此外,Python是一種比django模板語言更強大的語言,因此使它更容易(或可能在所有)執行嚴肅的邏輯,sa通過例如防止無限遞歸收集訪問任務或類似的東西。 – schwobaseggl