在我的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 %}
?
答案 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 %}