2015-11-25 72 views
2

我在模板代碼:如何識別if語句中的第一個循環調用?

{% for p in products %} 
    {% if p.parent == None %} 
     <li class="{% if forloop.first %}active{% endif %}"> 
      {{ p.name|upper }} 
     </li> 
    {% endif %} 
{% endfor %} 

在我的案例課「活動的」顯示我與父=無利!我無法使用過濾器(父=無),因爲我必須擁有完整的產品列表。

問題是,如果第一個object.parent在產品=! None Django會認爲第一次迭代發生,所以我永遠不會將active添加到我的課程。 所以我想檢查什麼時候第一次迭代成功if聲明發生了。任何方式來做到這一點?

+0

爲什麼你''==在你的模板,如果你需要'='!? – pythad

+0

我需要==,我必須只顯示主要產品 – Nips

+0

您可以使用{%if not p.parent%}?通常如果一個元素是None,它將註冊爲false。 – MBrizzle

回答

3

你可以恢復的第一個元素在蟒蛇的觀點,它在你的模板添加到上下文,然後測試:

{% for p in products %} 
    {% if not p.parent %} 
     <li class="{% if p == first_element %}active{% endif %}"> 
      {{ p.name|upper }} 
     </li> 
    {% endif %} 
{% endfor %} 
+0

+1用於推薦在視圖中完成處理。 Django在整個地方都說模板是有意愚蠢的,處理應該在視圖中完成。 –

0
{% with is_first=True %} 
{% for p in products %} 
    {% if p.parent == None %} 
     <li class="{% if is_first %}active{% endwith % }{% endif %}"> 
      {{ p.name|upper }} 
     </li> 
    {% endif %} 
{% endfor %} 

現在不能測試 - 但也許那個工作!

0

你可以把這個對象本身或作爲額外的變量,你什麼時候構建上下文。做這樣的代碼:

例如而不是:

ctx['products'] = Product.objects.all() 

做是這樣的:在模板

ctx['products'] = list(Product.objects.all()) 
    is_first = True 
    for p in ctx['products']: 
     p.is_active = p.parent is None and is_first: 
     is_first = False 

然後,就這樣做:

<li class="{% if p.is_active %}active{% endif %}"> 
    {{ p.name|upper }} 
</li> 

如果你不想上的對象,使用寫額外變量

ctx['products'] = list(Product.objects.all()) 
    is_first = True 
    for p in ctx['products']: 
     if p.parent is None and is_first: 
      ctx['active_id'] = p.id 
      break 

然後在模板,只是做:

<li class="{% if p.id == active_id %}active{% endif %}"> 
    {{ p.name|upper }} 
</li> 
0

您也可以使用forloop.counter這樣

{% for p in products %} 
    {% if forloop.counter == 0 %} 
     <li class="{% if is_first %}active{% endwith % }{% endif %}"> 
      {{ p.name|upper }} 
     </li> 
    {% endif %} 
{% endfor %}