2012-05-05 71 views
0

在我的django视图中,我传递一个包含多个项目的列表。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

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

{% 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代码。

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 %} 

这是一对夫妇的行数比尼克的解决方案,但是,如果这些元素确实有自然加入他们的属性,我会说这是一个更优雅的解决方案。

0

你可能想要枚举你的总共6个元素的批量大小为2的批次,这会给你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 %}