我有一个模板变量product_list
,它是QuerySet
个Product
个对象;反过来,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
。在我的情况下它是可行的,但我仍然对我的第一种方法的解决方案感兴趣。
答案 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