Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django模板过滤器,使用2个或更多类似管道的过滤器_Django_Django Template Filters - Fatal编程技术网

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

django模板过滤器,使用2个或更多类似管道的过滤器,django,django-template-filters,Django,Django Template Filters,我想在模板上使用多个筛选器,如下所示: value: {{ record.status|cut:"build:"|add:"5" }} 其中record.status将被构建:n,0

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

value: {{ record.status|cut:"build:"|add:"5" }}
其中record.status将被构建:n,0 我试过上面的代码,它只在第一个过滤器上生效, 所以我没有得到加5的值

django是否只支持一个过滤器?
谢谢

支持链接筛选器。如果你想知道为什么它不起作用,那么我要做的是:

  • 安装ipdb
  • 在django/templates/defaultfilters.py中,找到“def add”,并将“import ipdb;ipdb.set_trace()”放在函数顶部
  • 再次在浏览器中打开该页面,您应该能够跟踪运行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/uuu init_uuuuuuuu.py
    存在-它可以为空)。然后在模板中使用它,如下所示:

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

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

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

    >>> from django.template import *
    >>> t = Template('{{ x|'+'|'.join(['add:1']*10000)+' }}')
    >>> t.render(Context({'x':0}))
    u'10000'
    
    其次,请检查模板以确保您使用的是内置版本的
    cut
    add
    ;还要检查
    剪切后的输出值,以确保它可以强制为int而不引发异常。
    我刚刚检查发现,即使是Django 0.95也支持这种用法:

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

    它输出什么?如果record.status是build:53,它只输出53,而不是58。只是测试了它,对我来说很好(对于字符串“build:53”)。但无论如何,这不是正确的方法。什么是记录?模型实例?只需向它添加另一个方法来完成任务,为它编写一个好的docstring,它将是干净且可维护的解决方案。抱歉,我再次尝试,它工作了,我不确定昨天为什么得到了错误的值,谢谢大家,我想add“将首先尝试将两个值强制为整数”。哦,我不只是在想,它确实在尝试。我添加了关于如何调试添加过滤器的说明。我自己也遇到过这个问题,但从那以后已经有一段时间了,我不记得我是如何解决的。所以,我认为可能是由于某种原因,它不能像预期的那样工作。谢谢你的反馈。