4

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

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

其中 record.status 将是 build:n, 0 < n< 100 但我想将此值添加为基值 5。

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

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

4

2 回答 2

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'

cut其次,请检查模板,确保您使用的是和的内置版本add;还要检查 之后的输出值,cut以确保它可以被强制为 int 而不会引发异常。
我刚刚检查并发现即使是 Django 0.95 也支持这种用法:

def add(value, arg):
    "Adds the arg to the value"
    return int(value) + int(arg) 
于 2012-05-03T14:09:41.347 回答
1

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

  1. 安装ipdb
  2. 在django/templates/defaultfilters.py中,找到“def add”,将“import ipdb; ipdb.set_trace()”放在函数顶部
  3. 再次在浏览器中打开页面,您应该能够从运行 runserver 的终端跟踪代码的执行情况,并找出您没有得到预期结果的原因

一种更简单的方法是制作自己的模板过滤器。它可能看起来像

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 }}

当然,这是未经测试的伪代码。但只要稍加努力,你就可以让它发挥作用。

于 2012-05-03T08:10:52.730 回答