django模板过滤器,使用2个或更多过滤器像管道

时间:2012-05-03 07:46:59

标签: django django-template-filters

我想在模板上使用多个过滤器,如下所示:

value: {{ record.status|cut:"build:"|add:"5" }}

将构建record.status:n,0< N'LT; 100 但我想将此值添加为基值5.

我试过上面的代码,它只对第一个过滤器生效, 所以我没有得到加上5的值。

django只支持一个过滤器吗? 感谢

2 个答案:

答案 0 :(得分:4)

首先,你的问题的答案“django只支持一个过滤器吗?”就是它 Django确实支持几乎无限的数量的链式过滤器(取决于您的平台和当然编写该数量的链式过滤器的能力=)。以一些代码为例(不是证明但有意义),它实际上是一个模板'{{ x|add:1|add:1|...10000 in all...|add:1 }}'

>>> from django.template import *
>>> t = Template('{{ x|'+'|'.join(['add:1']*10000)+' }}')
>>> t.render(Context({'x':0}))
u'10000'

其次,请检查模板以确保您使用的内置版cutadd;还要检查cut之后的输出值,以确保它可以被强制转换为int而不会引发异常 我刚检查过,发现连Django 0.95都支持这种用法:

def add(value, arg):
    "Adds the arg to the value"
    return int(value) + int(arg) 

答案 1 :(得分:1)

支持链接过滤器。如果你想弄清楚为什么它不起作用,那么我要做的是:

  1. 安装ipdb
  2. 在django / templates / defaultfilters.py中,找到“def add”,并在函数顶部放入“import ipdb; ipdb.set_trace()”
  3. 再次在浏览器中打开页面,您应该能够从运行runserver的终端执行代码并找出为什么没有得到预期的结果
  4. 更简单的方法是make your own template filter。它可能看起来像

    from django.template import Library
    
    register = Library()
    
    @register.filter
    def cut_and_add(value, cut, add):
        value = value.replace(cut, '')
        value = int(value) + add
        return value
    

    假设您将其保存在yourapp/templatetags/your_templatetags.py中(并且yourapp/templatetags/__init__.py存在 - 它可以为空)。然后你会在模板中使用它:

    {% load your_templatetags %}
    
    {{ record.status|cut_and_add:"build:",5 }}
    

    当然,这是未经测试的伪代码。但是只需付出一点努力就可以让它发挥作用。