【问题标题】:How to use template tag to iterate through manytomany model?如何使用模板标签迭代多对多模型?
【发布时间】:2016-11-12 20:01:12
【问题描述】:

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

如何在不必为每个级别的任务编写 for 循环的情况下遍历所有模型?

示例但类似无限子任务:

  1. 任务 #1

    1.1 子任务 #1

    1.2 子任务 #2

    1.2.1 子任务#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 %}

如何使用模板标签无限循环任务

【问题讨论】:

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


    【解决方案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 %}
    

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

    【讨论】:

    • 关于循环子任务的要点。为什么实现自定义标签比使用 with 更好?
    • 使用“with”已经是一种防止模板编译器无限递归的功夫了……另外,Python是比django模板语言更强大的语言,因此,更容易(或根本不可能)实现严肃的逻辑,s.a.通过例如防止无限递归收集访问过的任务或类似的东西。
    猜你喜欢
    • 2017-03-26
    • 2014-03-12
    • 2012-10-07
    • 2022-07-17
    • 2023-03-17
    • 2012-02-29
    • 1970-01-01
    • 2022-11-25
    • 2017-01-05
    相关资源
    最近更新 更多