使用Django过滤器作为变量
我想知道我们是否可以使用django filter作为一个变量,其中python方法格式化文本可以设置可以由模板呈现的过滤器值 过滤器通常的工作方式如下 {{html_text | safe}或{{plain_text | linebreaks} 我想在变量中设置过滤器“safe”/“linebreaks”的值,并将其呈现如下 {{text | filter_variable}}使用Django过滤器作为变量,django,Django,我想知道我们是否可以使用django filter作为一个变量,其中python方法格式化文本可以设置可以由模板呈现的过滤器值 过滤器通常的工作方式如下 {{html_text | safe}或{{plain_text | linebreaks} 我想在变量中设置过滤器“safe”/“linebreaks”的值,并将其呈现如下 {{text | filter_variable}} 在线研究,但无法找出答案,如有任何帮助,将不胜感激。您不能这样做,但您可以创建一个接受参数的自定义筛选器: from
在线研究,但无法找出答案,如有任何帮助,将不胜感激。您不能这样做,但您可以创建一个接受参数的自定义筛选器:
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…来包装上面的内容,除了
,因为如果通过一个坏的过滤器或需要更多参数而不仅仅是值
的过滤器,它可能会很容易爆炸。我想这取决于你对模板作者的信任程度。。。就我而言,是我,所以我很信任你!永远不要假设您将始终是处理代码的人。生活是多变的,所以你应该为不可预见的事情而设计。