代码之家  ›  专栏  ›  技术社区  ›  Mat

Django for循环有多大的灵活性?

  •  3
  • Mat  · 技术社区  · 16 年前

    我正在模板中输出一系列Django对象:

    {% for obj in list %}
        ...
    {% endfor %}
    

    但我只想输出其中的前五个,然后将其余的放在单独的 <DIV>.

    我设想这样的情况,但需要限制迭代的元素:

    {% for obj in list %}
        ...
    {% endfor %}
    
    <a href="" onclick="unhide()">Show hidden</a>
    <div id="hidden">
        {% for obj in list %}
            ...
        {% endfor %}
    </div>
    

    是否可以单独在模板中执行此操作?这是表示逻辑,所以我不想污染视图。

    3 回复  |  直到 16 年前
        1
  •  16
  •   Paolo Bergantino    16 年前

    你可以用 slice :

    {% for obj in list|slice:":5" %}
        ...
    {% endfor %}
    
    <a href="" onclick="unhide()">Show hidden</a>
    <div id="hidden">
        {% for obj in list|slice:"5:" %}
            ...
        {% endfor %}
    </div>
    
        2
  •  7
  •   Andy Baker    16 年前

    与模板限制抗争通常是一个迹象,表明如果您在您的视图中做了更多的工作,生活可能会更简单:

    context = {
      'visible_list': mylist[:5],
      'hidden_list': mylist[5:]
    }
    

    我并不是说这必然比上面的切片过滤器解决方案好,但它通常值得考虑为模板传递一个上下文对象,并对所有内容进行良好设置。如果以后逻辑变得更复杂,它允许您更容易地进行调整。

    表示逻辑在视图中非常适合。我并不特别认为这是“污染”。

        3
  •  2
  •   Alex Martelli    16 年前

    当然,例如,您可以执行两次循环,并在其中使用 forloop.counter 合适的 if <= 5 ,第二次只有在 > 5 forloop.counter0 相反)。