Django模板和拆分变量列表

时间:2012-05-05 15:25:09

标签: django django-templates

在我的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 个答案:

答案 0 :(得分: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代码。

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

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

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

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