2010-08-12 152 views
0

我在嘗試在兩個維度上同時迭代模板時遇到了問題。幽靈自定義模板過濾器?

基本情況說明如下:

http://www.djangobook.com/en/2.0/chapter04/(在蘋果,香蕉指數爲例)

>>> from django.template import Template, Context 
>>> t = Template('Item 2 is {{ items.2 }}.') 
>>> c = Context({'items': ['apples', 'bananas', 'carrots']}) 
>>> t.render(c) 
u'Item 2 is carrots.' 

如果我想從1迭代至3本與變量「fruitstep」我無法在模板中執行此操作:

{{items.fruitstep}}失敗,考慮長點鏈,此概念會導致模板上的大量迭代需求。但我找不到一個標準的做法,我不確定這是不錯的模板練習。

所以,我創建了一個模板過濾器:

@register.filter 
def key2value(collection,key): 
    try: 
     return collection[unicode(key)] # It seems that my collection 
             # keys are in unicode... 
    except: 
     return "" 

這似乎是一個非常強大的過濾器。它開始是一個非常具體的標籤,但我想不出一個不完全通用的理由。

我想知道是否有一個標準的方法來做到這一點,我已經徹底改變了輪子,或者如果這段代碼可以做一些可以危害系統的東西。

謝謝!

+0

我意識到安全問題與確保返回的任何內容是HTML安全有關。我相信,通過不改變任何默認值,它將逃脫返回的信息,但通過這種過濾器,將無法驗證集合中的物品是否安全... – iJames 2010-08-12 20:47:51

回答

0

不,沒有理由不在您自己的應用程序中這樣做。我經常做類似的過濾器,並且事實上在這裏發佈了非常類似的代碼來回答各種問題。

很難想象提供字典查找可能會危及系統的方式。這個功能在Django中默認沒有提供,因爲最初的願望是擁有一個受限制的模板語言 - 這個特定的過濾器是否應該從一開始就提供,這是有爭議的,但是假設它不是,它不太可能被添加現在。

+0

謝謝!我很高興有安慰。在閱讀關於自定義過濾器的部分時,似乎問題在於使字符串HTML安全。在我看來,這將使它變得不可能,所以我可以看到它是如何由程序員自行決定的。 儘管如此,我正在考慮分離點組的替代分隔符。我可以看到向標記渲染器添加了添加多個點以分割點字符串的能力嗎? thispoll.thechoices..forloop.counter 甚至 thispoll.thechoices..myselectlist..forloop.counter 哦,已經明確。好吧,回去工作。 – iJames 2010-08-13 18:00:56