0
在一個模板中,我顯示了一個項目(i)的前5個翻譯。以下邏輯模板處理:模板構造...它的工作原理,但感覺很難看
- 如果有超過5名翻譯:我修剪列表並顯示一個 鏈接
more...
。 - 如果有1到5個譯文:我只是給他們看。
- 如果沒有翻譯:我顯示添加翻譯的鏈接。
這裏是我想出了(功能)模板代碼:
{% if i.translation_set.all %}
<ul>
{% for t in i.translation_set.all|slice:"6" %}
{% if forloop.counter < 6 %}
<li>
<a href="#">
<i class="fa fa-play mr-2"></i>
{{ t.language }}
<i class="fa fa-commenting-o ml-1"></i>
</a>
</li>
{% else %}
<li>more...</li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<a href="{% url 'view-item' i_id=i.id slug=i.slug %}">Add translation</a>
{% endif %}
這裏是我的關於這段代碼的擔憂:
爲if i.translation_set.all
執行什麼樣的查詢
- ?它是查詢所有翻譯還是停在1?
- 使用相同的
slice
查詢可能會更好,因爲它稍後會被使用,並且可能會自動被緩存? - 查詢6個項目感覺很難看,只需要顯示最大值5。是否有另一種方式來告訴有超過5個項目?
爲什麼'{%with%}'標記比直接的{%for%}'循環更好地被視爲(在這種情況下)?編輯:我現在看到,你也可以在'{%if%}'中使用它。是否爲更清晰的代碼,是的。 –
準確地說 - 通過使用'{%with%}'標記,您可以在'{%if%}'標記中使用queryset並循環它,並且只會從數據庫中提取一次。 – Alasdair
是的,我實際上試圖弄清楚如何將查詢集存儲在變量中。看起來像這樣優雅地解決它。我決定去取6個結果,因爲代碼看起來很明顯。 –