C'est possible et assez simple.
Django n'autorise qu'un seul argument à votre filtre, mais il n'y a aucune raison pour que vous ne puissiez pas mettre tous vos arguments dans une seule chaîne en utilisant une virgule pour les séparer.
Ainsi, par exemple, si vous voulez un filtre qui vérifie si la variable X est dans la liste [1,2,3,4], vous aurez besoin d'un filtre modèle qui ressemble à ceci :
{% if X|is_in:"1,2,3,4" %}
Maintenant nous pouvons créer votre templatetag comme ceci :
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)
La ligne qui crée arg_list est une expression génératrice qui divise la chaîne args sur toutes les virgules et appelle .strip() pour supprimer les espaces de début et de fin.
Si, par exemple, le troisième argument est un int, il suffit de faire :
arg_list[2] = int(arg_list[2])
Ou si tous sont des ints, faites-le :
arg_list = [int(arg) for arg in args.split(',')]
EDIT : pour répondre spécifiquement à votre question, en utilisant des paires clé-valeur comme paramètres, vous pouvez utiliser la même classe que celle utilisée par Django pour analyser les chaînes de requête à partir des URL, ce qui a également l'avantage de gérer correctement le codage des caractères en fonction de votre fichier settings.py.
Ainsi, comme pour les chaînes de requête, chaque paramètre est séparé par "&" :
{{ attr.name|replace:"cherche=_&remplacement= " }}
Votre fonction de remplacement ressemblera alors à ceci :
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
Vous pourriez accélérer un peu le processus au risque de faire des remplacements incorrects :
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))