【问题标题】:Spooky Custom Template Filter?诡异的自定义模板过滤器?
【发布时间】:2011-03-29 03:19:58
【问题描述】:

我在尝试同时在两个维度上迭代模板时遇到了麻烦。

这里说明基本情况:

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.'

如果我想用变量“fruitstep”从 1 迭代到 3,我不能在模板中这样做:

{{ items.fruitstep }} 失败并且考虑到长点链,这个概念会导致对模板的大量迭代要求。但我找不到标准的做法,我不确定这是一种好的模板做法。

所以,我创建了一个模板过滤器:

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

这似乎是一个非常强大的过滤器。它开始是一个非常具体的标签,但我想不出理由不让它完全通用。

我想知道是否有一种标准方法可以做到这一点并且我已经重新发明了轮子,或者这段代码是否可以做一些可能危及系统的事情。

谢谢!

【问题讨论】:

  • 我意识到安全问题与确保返回的任何内容都是 HTML 安全有关。我相信通过不更改任何默认值,它会转义返回的信息,但是使用这种过滤器将无法验证集合中的项目是否安全......

标签: django templates tags rendering filter


【解决方案1】:

不,没有理由不在您自己的应用程序中执行此操作。我经常做类似的过滤器,实际上在这里发布了非常相似的代码来回答各种问题。

很难想象提供字典查找会损害系统的方式。由于最初希望使用受限制的模板语言,因此默认情况下在 Django 中不提供此功能 - 是否应该从一开始就提供这个特定的过滤器是有争议的,但鉴于它不是,它不太可能被添加现在。

【讨论】:

  • 谢谢!我很高兴得到安慰。在阅读有关自定义过滤器的部分时,似乎问题在于使字符串 HTML 安全的清晰度。在我看来,这将使它成为不可能,所以我可以看到它是如何由程序员自行决定的。尽管如此,我正在考虑使用另一种分隔符来分隔点组。我可以看到向标签渲染器添加添加多个点来划分点串的能力? thispoll.thechoices..forloop.counter 甚至 thispoll.thechoices..myselectlist..forloop.counter 哦,已经模棱两可了。好吧,回去工作吧。
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2012-08-19
  • 2014-02-13
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多