2012-01-20 64 views
18

我在頁面上有一些循環,需要依賴於循環編號的列表項。在django模板中動態獲取列表項目

當我打電話:

{{ mylist.1 }} 
{{ mylist.2 }} 
{{ mylist.3 }} 

所有工作正常,但我真正需要的是一樣的東西:

{% for x in somenumber|MyCustomRangeTag %} 
    {{ mylist.x }} 
{% endfor %} 

MyCustomRangeTag給我的Python range()它的工作原理和我已經有x的數量。所以x是1,2,3等,取決於循環數。 這是可能的和如何?

+0

你可以在視圖中傳遞你需要的值嗎?如果您事先知道範圍,爲什麼不通過您嘗試顯示的確切值? – dm03514

+0

不,我不能在這種情況下。這是硬編碼的自定義購物車頁面,所有這些都是一些嵌套表格的一部分。 – Goran

回答

25

這是不可能的,因爲直接的Django認爲"x"mylist查找的關鍵 - 而不是x的值。所以,當x = 5時,Django試圖查找mylist["x"]而不是mylist[5]

使用下面的過濾器解決方法:

@register.filter 
def lookup(d, key): 
    return d[key] 

,並使用它像

{{ mylist|lookup:x }} 
+2

如果'{{mylist | lookup:x}}'的輸出是一個對象並且我還需要訪問某些東西?類似於'mylist.1.first_name' – zengr

+2

@zengr嘗試使用'%lookup_result = mylist | lookup:x%} {{lookup_result.first_name}} {%endwith%}'。 – valid

3

你確定你不能只是做:

{% for item in mylist %} 
    {{ item }} 
{% endfor %} 

具有層過濾器,你甚至可以做一些定製。

+0

我想你的意思是在第二行有'{{item}}'。在這裏也值得注意的是,如果你因爲某種原因需要索引,你可以在循環中使用'{{forloop.counter}}'。 – aganders3

+0

哈哈,不用擔心。不過謝謝你的提示。我其實並沒有被你的代表嚇倒,我只是忘了我們能夠編輯答案。但是,當我在未來感到害羞時,這會激勵我。 – aganders3

6

我注意到,@ E-SATIS提到這個問題,但我認爲內置片模板標籤值得一些愛。

{{ item | slice:"2" }} #gets the third element of the list 
+0

這可能以前工作過,但給了一些時髦的結果,當我給它與Django 1.5 – Alvin

+0

這不適合我,但'{{some_list |切片:「:2」}}'做了訣竅--https ://docs.djangoproject.com/en/1.7/ref/templates/builtins/#slice – Hayden

+0

@Hayden我相信只能得到列表的前兩個元素?我更新了代碼以修復過濾器語法。 –

4

Django模板中的切片標籤可能使用python的切片代碼,但語法明顯不同。舉例來說,如果你想獲得一個變量序列的元素,在Python中,你會寫類似下面的東西:

>>>mylist = ["0th Element", "1th Element"] 
>>>zero, one = 0, 1 
>>>mylist[zero] 
"0th Element" 
>>>mylist[one] 
"1th Element" 

使用此語法與Django的片模板標籤將返回一個列表切片在任何情況下可疑的效用,爲獲得知名指數的項目:

{% with "0" as zero %} 
{% with "1" as one %} 
{% with "2" as two %} 

{{mylist|slice:zero}} {{mylist|slice:one}} {{mylist|slice:two}} 

{% endwith %} 
{% endwith %} 
{% endwith %} 

呈現到HTML:

[] ["0th Element"] ["0th Element", "1th Element"] 

注意區別:你所得到的重mylist[:x]而不是mylist[x]

Django提供了足夠的工具來解決這個問題。第一個技巧是使用像0:1這樣的顯式切片作爲您的索引,然後使用|join:""將結果列表轉換爲單個元素。像這樣:

{% with "0:1" as zero %} 
{{mylist|slice:zero|join:""}} 
{% endwith %} 

產量:

0th Element 

這都在特別方便,如果你需要訪問父循環的指數與迭代處理子循環中時:

{% for parent in parent_loop %} 
    {% cycle "0:1" "1:2" "2:3" as parent_loop_index silent %} 
    {% for child in child_loop %} 
     {{child|slice:parent_loop_index|join:""}} 
    {% endfor %} 
{% endfor %} 

儘管沒有任何東西完成,但我不認爲Django已經實現了成就。

+0

謝謝! '|加入: 「」'! –