这是可能的,而且相当简单。
Django 只允许您的过滤器使用一个参数,但是您没有理由不能将所有参数放入一个字符串中,并使用逗号将它们分隔开。
例如,如果您想要一个过滤器来检查变量 X 是否在列表 [1,2,3,4] 中,您将需要一个如下所示的模板过滤器:
{% if X|is_in:"1,2,3,4" %}
现在我们可以像这样创建您的模板标签:
from django.template import Library
register = Library()
def is_in(var, args):
if args is None:
return False
arg_list = [arg.strip() for arg in args.split(',')]
return var in arg_list
register.filter(is_in)
创建 arg_list 的行是一个生成器表达式,它将 args 字符串拆分为所有逗号,并调用 .strip() 来删除任何前导和尾随空格。
例如,如果第三个参数是 int,则只需执行以下操作:
arg_list[2] = int(arg_list[2])
或者,如果它们都是整数,则:
arg_list = [int(arg) for arg in args.split(',')]
编辑:现在要通过使用键值对作为参数来具体回答您的问题,您可以使用 Django 用于解析 URL 中的查询字符串的相同类,这也具有根据您的 settings.py 正确处理字符编码的好处。
因此,与查询字符串一样,每个参数都用“&”分隔:
{{ attr.name|replace:"cherche=_&remplacement= " }}
那么你的替换函数现在看起来像这样:
from django import template
from django.http import QueryDict
register = template.Library()
@register.filter
def replace(value, args):
qs = QueryDict(args)
if qs.has_key('cherche') and qs.has_key('remplacement'):
return value.replace(qs['cherche'], qs['remplacement'])
else:
return value
您可以加快速度,但冒着进行一些错误替换的风险:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))