Django模板和拆分变量列表

Django模板和拆分变量列表,django,django-templates,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&g

在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>
  • 第一项 第二项
  • 第3项 第4项
  • 第5项 第6项

您可以看到模式,每两个项目,我需要将它们拆分并放入一个新的
  • 。如何使用
    {%for item in my_list%}
    循环并将这些变量除以每两个?

    您可以尝试这样的方法,它不是特别优雅,也没有经过任何测试

    {% if list_of_items %}
    <ul>
    <li>
      {% for item in list_of_items %}
      <div>{{ item }}</div>
      {% cycle '' '</li><li>' %}
      {% endfor %}
    </li>
    </ul>
    {% endif %}
    
    {%if\u项列表%}
    
    • {u个项目的列表中项目的百分比%} {{item}} {%cycle'
    • '%} {%endfor%}
    {%endif%}
    您可以首先在视图中重新排列列表,使其成为列表列表列表,或者您也可以编写自己的批处理筛选器


    据我所知,没有一种真正简单的django模板方法可以实现您想要的功能-django模板故意限制您编写python代码。

    如果项目具有一些属性,可以将它们自然分组成对,您可以使用
    重新分组

    {% 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 %}
    
    {%if\u项列表%}
    
      {%按属性将\u项的列表\u重新组合为项目\u块%} {项_chunks%}中的块的%
    • {chunk.list%中的项的%s} {{item}} {%endfor%}
    • {%endfor%}
    {%endif%}

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

    您可能希望以2大小的批次枚举6个元素的总列表,这将为您提供3个批次,然后循环每个批次

    为此,可以在templatetags目录中添加自定义批处理筛选器。以下是添加自定义标记/过滤器的文档。

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

    @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 %}
    
    {%用于列表中的批次|批次:2%}
    
  • {对于批处理%中的元素,} {{element}} {%endfor%}
  • {%endfor%}
    为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 %}
    
    {%block content%}
    {products%中产品的%s}
    {{product.name}
    {%if-forloop.counter |可除数为:“6”}
    {%endif%}
    {%endfor%}
    {%endblock内容%}