2010-08-12 91 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