Es posible y bastante simple.
Django solo permite un argumento para su filtro, pero no hay razón para que no pueda poner todos sus argumentos en una sola cadena usando una coma para separarlos.
Entonces, por ejemplo, si desea un filtro que verifique si la variable X está en la lista [1,2,3,4], querrá un filtro de plantilla que se vea así:
{% if X|is_in:"1,2,3,4" %}
Ahora podemos crear su etiqueta de plantilla así:
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 línea que crea arg_list es una expresión generadora que divide la cadena de argumentos en todas las comas y llama a .strip () para eliminar los espacios iniciales y finales.
Si, por ejemplo, el tercer argumento es un int, simplemente haz lo siguiente:
arg_list[2] = int(arg_list[2])
O si todos ellos lo hacen:
arg_list = [int(arg) for arg in args.split(',')]
EDITAR: ahora, para responder específicamente a su pregunta utilizando pares clave, valor como parámetros, puede usar la misma clase que usa Django para analizar cadenas de consulta de URL, que luego también tiene la ventaja de manejar la codificación de caracteres correctamente de acuerdo con su configuración.py .
Entonces, al igual que con las cadenas de consulta, cada parámetro está separado por '&':
{{ attr.name|replace:"cherche=_&remplacement= " }}
Entonces su función de reemplazo ahora se verá así:
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
Puede acelerar esto con el riesgo de hacer algunos reemplazos incorrectos:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))