簡體   English   中英

django 模板使用模板變量作為索引獲取列表項

[英]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.counter0forloop.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM