2016-11-12 10 views
0

私はDjangoを学ぼうとしていますが、私は困っているので助けが必要です。テンプレートタグを使用してmanytomanyモデルを反復処理する方法は?

私はどのように私が持っているタスクの各レベルのためのループを書く必要なく、私のすべてのモデルを反復することができますか?

例が、無限のサブタスク等:

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

どのように私は、forループを無限にテンプレートタグを使用することができますダウンタスク

答えて

1

自体に多くの分野に多くの再帰のいくつかの形式を使用します。今、あなたが他のテンプレートに"tasks.html"を含めることができ

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

:Djangoはincludeテンプレートタグ(このanswerで説明したように)の再帰的な使用を許可し

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

実装するため、おそらくより良い練習ですカスタムタグを作成し、テンプレートから再帰コードを移動しますが、原則は変わりません。別の注意点として、あなたの現在のモデル構造はあなたの仕事グラフが円形であることを妨げません。 2つのタスクがお互いのサブタスクである場合、あなたは無限の再帰で終わります。

+0

円のサブタスク上のポイント。それを使うのではなくカスタムタグを実装する方がいいのはなぜですか? – TanyaG

+0

"with"の使用は、既にテンプレートコンパイラが無限に再帰するのを防ぐkung-fuのようなものです...さらに、Pythonはdjangoのテンプレート言語よりも強力な言語です。可能な限り)真剣なロジックを実装するために、sa無限再帰を防止する。訪問されたタスクまたは類似のものを収集する。 – schwobaseggl

関連する問題