[英]django template get a list item using a template variable as index
假設list0
包含元素['a','b','c','d']
,我需要根據模板變量(如forloop.counter0
或模板中可用的任何其他 integer)來獲取第 n 個元素。
到目前為止,我發現的更好的方法是創建一個自定義標簽,如此處或此處以及django 文檔中所述。
定義后,您可以編寫如下內容:
{% for elm in list0 %}
{{ elm }} {{ list1|index:forloop.counter0 }}
{% endfor %}
該示例假設有另一個列表list1
,其中包含元素['A','B','C','D']
。
index
是自定義過濾器的名稱,它使用 forloop 計數器作為索引來獲取每個list1
元素: list1[0]
, list1[1]
, list1[2]
, list1[3]
所以這會產生:
a A
b B
c C
d D
但是,如果您只想使用內置過濾器怎么辦?
(或者有空閑時間做娛樂活動?)
經過一些研究和測試,我發現的唯一方法是這個奇怪的事情:
{% for elm in list0 %}
{% with sl0=forloop.counter0|make_list sl1=forloop.counter|make_list %}
{% with header_id=sl0.0|add:":"|add:sl1.0 %}
{{ elm }} {{ list1|slice:header_id|join:"" }}
{% endwith %}
{% endwith %}
{% endfor %}
它能做什么:
它使用slice內置過濾器。 slice 需要一個表示 python 列表部分的字符串,例如由第二個
with
和兩個add
生成的'[2:3]'
。 因此,需要使用 forloop 計數器一次切片一個成員:'[0:1]'
、'[1:2]'
、'[2:3]'
...但是forloop.counter0
和forloop.counter
是整數,並且在這種情況下add
不會生成字符串。 結果,它試圖獲得 integer。 因此需要將其轉換為字符串。 這就是為什么make_list
在第一個中with
的原因,因為這是我迄今為止發現的將 integer 更改為字符串的唯一方法。最后 slice 返回一個包含一個元素的列表,因此它使用join:""
將其轉換為細繩。
我希望我錯過了文檔中的某些內容,因為上面的代碼......好吧......很糟糕 - 但很有趣。
如何使用 django 內置模板有效地滿足這一需求?
我同意在視圖中而不是模板中構建上下文時應該解決它,但是假設它不能完成。
您不應該在模板中執行此操作,模板用於呈現邏輯,由視圖提供正確的結構。 我們可以用zip(…)
做到這一點:
from django.shortcuts import render
def my_view(request):
list0 = ['a', 'b', 'c', 'd']
list1 = ['A', 'B', 'C', 'D']
list01 = zip(list0, list1)
return render(request, '', {'list01': list01})
然后用以下方式渲染它:
{% for elm0, elm1 in list01 %}
{{ elm0 }} {{ elm1 }}
{% endfor %}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.