0

在我的 django 视图中,我传递了一个包含多个项目的列表。

我的html设计是这样的:

<ul>
 <li>
   <div>1st item</div>
   <div>2nd item</div>
</li> 
 <li>
   <div>3th item</div>
   <div>4th item</div>
 </li> 
 <li>
   <div>5th item</div>
   <div>6th item</div>
 </li>
</ul>

你看模式,每两个项目,我需要将它们拆分并放入一个新的<li></li>. 如何使用每两个循环和划分这些变量{% for item in my_list %}

4

4 回答 4

0

如果项目具有将它们自然分组的某些属性,则可以使用regroup

{% if list_of_items %}
    <ul>
    {% regroup list_of_items by property as item_chunks %}
    {% for chunk in item_chunks %}
        <li>
        {% for item in chunk.list %}
        {{ item }}
        {% endfor %}
        </li>
    {% endfor %}
    </ul>
{% endif %}

这比尼克的解决方案多几行,但如果这些元素确实具有自然连接它们的属性,我会说这是一个更优雅的解决方案。

于 2012-05-06T03:50:30.863 回答
0

你可以尝试这样的东西,它不是特别优雅,也没有经过任何测试!

{% if list_of_items %}
<ul>
<li>
  {% for item in list_of_items %}
  <div>{{ item }}</div>
  {% cycle '' '</li><li>' %}
  {% endfor %}
</li>
</ul>
{% endif %}

您可以首先在视图中重新排列列表以使其成为列表列表,或者您可以编写自己的批处理过滤器。

据我所知,没有一种非常简单的 django 模板方式来做你想做的事 - Django 模板故意限制你编写 python 代码。

于 2012-05-05T16:02:39.243 回答
0

您可能想要枚举大小为 2 的批次中的 6 个元素的总列表,这为您提供 3 个批次,然后遍历每个批次。

为此,您可以在 templatetags 目录中添加自定义批处理过滤器。这是添加自定义标签/过滤器的文档。 https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/

您的自定义过滤器可以是这样的。

@register.filter

def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]

在你的 html

     {% for batch in yourlist|batch:2%}
        <li>
          {% for element in batch %}
              <div>{{element}}</div>
          {% endfor %}
        </li>
      {% endfor %}
于 2016-03-09T14:22:16.817 回答
0

为 Django 3.1 更新这个答案

{% block content %}
    <div class="row">
    {% for product in products %}
        <div class="col-md-auto">
           <h5>{{ product.name }}</h5>
        </div>

    {% if forloop.counter|divisibleby:"6" %}
        </div>
        <div class="row">
    {% endif %}

    {% endfor %}
    </div>

{% endblock content %}
于 2021-02-01T22:54:26.877 回答