【问题标题】:How much flexibility is there in a Django for loop?Django for 循环有多大的灵活性?
【发布时间】:2010-11-01 01:16:59
【问题描述】:

我正在模板中输出一系列 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>

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

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    你可以使用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】:

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

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

      我并不是说这一定比上面的切片过滤器解决方案更好,但通常值得考虑将您的模板传递给所有设置都很好的上下文对象。如果以后逻辑变得更加复杂,它可以让您更轻松地适应。

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

      【讨论】:

      • 这种方法的另一个好处是可以很容易地在模板中添加条件以避免在没有任何隐藏的情况下显示“显示隐藏”。
      【解决方案3】:

      当然,例如,您可以执行两次循环,并在其中使用 forloop.counter 在合适的 if 构造中——第一次只在 &lt;= 5 时执行操作,第二次仅在 &gt; 5 时执行(记住它是从 1 开始的——如果你想要一个从 0 开始的,请改用forloop.counter0)。

      【讨论】:

        猜你喜欢
        • 2017-09-27
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多