使用Django过滤器作为变量

使用Django过滤器作为变量,django,Django,我想知道我们是否可以使用django filter作为一个变量,其中python方法格式化文本可以设置可以由模板呈现的过滤器值 过滤器通常的工作方式如下 {{html_text | safe}或{{plain_text | linebreaks} 我想在变量中设置过滤器“safe”/“linebreaks”的值,并将其呈现如下 {{text | filter_variable}} 在线研究,但无法找出答案,如有任何帮助,将不胜感激。您不能这样做,但您可以创建一个接受参数的自定义筛选器: from

我想知道我们是否可以使用django filter作为一个变量,其中python方法格式化文本可以设置可以由模板呈现的过滤器值

过滤器通常的工作方式如下

{{html_text | safe}或{{plain_text | linebreaks}

我想在变量中设置过滤器“safe”/“linebreaks”的值,并将其呈现如下

{{text | filter_variable}}


在线研究,但无法找出答案,如有任何帮助,将不胜感激。

您不能这样做,但您可以创建一个接受参数的自定义筛选器:

from django.template import defaultfilters

@register.filter
def apply_filter(value, filter):
    if filter == 'safe':
       return defaultfilters.safe(value)
    if filter == 'linebreaks':
       return defaultfilters.linebreaks(value)
    else:
       # You might want to raise an exception here, but for example purposes
       # I'll just return the value unmodified
       return value
然后,在模板中:

{{ text|apply_filter:filter_variable }}

如果您有几个过滤器,则此选项有效:

{% ifequal filter_variable 1 %}{{ text|safe }}{% endifequal %}
{% ifequal filter_variable 2 %}{{ text|linebreaks }}{% endifequal %}
{% ifequal filter_variable 3 %}{{ text|yourfilter }}{% endifequal %}

我赞同Chris Pratt所说的,但我会这样做:

from django.template import defaultfilters

@register.filter
def apply_filter(value, filter):
    return getattr(defaultfilters, filter)(value)

这样,它适用于任何过滤器。

函数是Python中的第一类对象。您可以将它们传递给其他函数,就像它们是变量一样。但是,在这种情况下,这对模板级别没有帮助。您必须编写另一个接受筛选方法的模板标记(作为字符串)应用于该值。感谢您的响应(以及所有其他回复者),这非常有帮助。这也会起作用。不过,我选择了明确的方法,以防止意外后果。某些过滤器本身需要参数,无法使用此自定义过滤器。不过,至少,您需要用
try…来包装上面的内容,除了
,因为如果通过一个坏的过滤器或需要更多参数而不仅仅是
的过滤器,它可能会很容易爆炸。我想这取决于你对模板作者的信任程度。。。就我而言,是我,所以我很信任你!永远不要假设您将始终是处理代码的人。生活是多变的,所以你应该为不可预见的事情而设计。