如何使用模板标签迭代多种模型?

时间:2016-11-12 20:01:13

标签: django django-models django-templates django-views

我正在努力学习Django,但我需要帮助,因为我无法理解。

如何迭代我的所有模型而不必为每个级别的任务编写循环?

示例,但是像无限子任务一样:

  1. 任务#1

    1.1子任务#1

    1.2子任务#2

    1.2.1子任务#3

  2. 任务#2

    2.1子任务#4

  3. 我的模型本身就有很多很多领域

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

    我的模板

    {{1}}

    如何将模板标记用于无限循环任务

1 个答案:

答案 0 :(得分: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 %}

实现自定义标记并将递归代码移出模板可能是更好的做法,但原则保持不变。另外,您当前的模型结构不会阻止您的任务图形为圆形:两个任务是彼此的子任务,你最终会得到无限的递归。