我想在模板上使用多个过滤器,如下所示:
value: {{ record.status|cut:"build:"|add:"5" }}
其中 record.status 将是 build:n, 0 < n< 100 但我想将此值添加为基值 5。
我试过上面的代码,它只对第一个过滤器生效,所以我没有得到加5的值。
django 只支持一个过滤器吗?谢谢
我想在模板上使用多个过滤器,如下所示:
value: {{ record.status|cut:"build:"|add:"5" }}
其中 record.status 将是 build:n, 0 < n< 100 但我想将此值添加为基值 5。
我试过上面的代码,它只对第一个过滤器生效,所以我没有得到加5的值。
django 只支持一个过滤器吗?谢谢
首先,回答您的问题“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'
cut
其次,请检查模板,确保您使用的是和的内置版本add
;还要检查 之后的输出值,cut
以确保它可以被强制为 int 而不会引发异常。
我刚刚检查并发现即使是 Django 0.95 也支持这种用法:
def add(value, arg):
"Adds the arg to the value"
return int(value) + int(arg)
支持链接过滤器。如果您想弄清楚为什么它不起作用,那么我要做的是:
一种更简单的方法是制作自己的模板过滤器。它可能看起来像
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 }}
当然,这是未经测试的伪代码。但只要稍加努力,你就可以让它发挥作用。