仅在之前未插入分隔符时插入分隔符

时间:2015-05-12 10:42:36

标签: python django django-templates

我有一个模板变量product_list,它是QuerySetProduct个对象;反过来,Product个对象具有Track个对象的一对多字段(当然,从Track反向映射),这可能是空的。我想创建一个Track列表,按Product分组,如下所示:

{% for product in product_list %}
    {% if this is not the first product with tracks %}
        <li class="separator"></li>
    {% endif %}

    {% for track in product.tracks %}
        <li>{{track}}</li>
    {% endfor %}
{% endfor %}

问题是,我应该怎么写if this is not the first product with tracks?我尝试了ifchanged product但它在第一次迭代时插入了一个分隔符(因为它从""更改为"someproduct")。 forloop.counter在这里也不可用,因为前两个产品可能没有曲目。

一种解决方法可能是将product_list更改为track_list,如下所示:

track_list = Track.objects.order_by('product__name')

所以我确实可以使用ifchanged。在我的情况下它是可行的,但我仍然对我的第一种方法的解决方案感兴趣。

1 个答案:

答案 0 :(得分:1)

你应该撰写条件。它看起来很简单,也许不是你要求的。

{% for product in product_list %}
    {% if not forloop.first and product.tracks %}
        <li class="separator"></li>
    {% endif %}

    {% for track in product.tracks %}
        <li>{{track}}</li>
    {% endfor %}
{% endfor %}

如果这不是您的解决方案,我建议您在视图上烹饪数据并准备好解析模板,这样更容易。

{% for product in product_list %}
    {% if product.should_have_separator %}
        <li class="separator"></li>
    {% endif %}

    {% for track in product.tracks %}
        <li>{{track}}</li>
    {% endfor %}
{% endfor %}

在您的视图中,动态地将should_have_separator字段附加到产品应该包含它:

product_list = Product.objects.....
is_the_first_product = True
for product in product_list:
    is_the_first_product_with_tracks = ( is_the_first_product 
                                        and bool( product.tracks ) )
    product.should_have_separator = not is_the_first_product_with_tracks
    is_the_first_product = False