2015-05-12 54 views
1

我有一個模板變量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_listtrack_list這樣的:

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

所以我的確可以使用ifchanged。在我的情況下是可行的,但我仍然對第一種方法的解決方案感興趣。

回答

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 
+0

這不是一個視圖,但是,增加了變量的模板,背景處理器,但肯定的,那就是贏得了烹調方法。如果在高負載時速度足夠快,我仍在測量,但它似乎正在工作。 – GergelyPolonkai

+1

對不起,我正在度假。我採取第二種方法,預先烹飪我的數據;似乎這個問題不能純粹用模板邏輯解決。 – GergelyPolonkai

+0

忘記添加我的烹飪方法(在視圖或上下文處理器中):'product_list.filter(tracks__isnull = False).distinct()'。 'distinct()'是必需的,因爲如果沒有那些產品將在QuerySet中爲次。 – GergelyPolonkai