È possibile e abbastanza semplice.
Django consente solo un argomento al tuo filtro, ma non c'è motivo per cui non puoi mettere tutti i tuoi argomenti in una singola stringa usando una virgola per separarli.
Quindi, ad esempio, se desideri un filtro che controlli se la variabile X è nell'elenco [1,2,3,4], vorrai un filtro modello simile a questo:
{% if X|is_in:"1,2,3,4" %}
Ora possiamo creare il tuo templatetag in questo modo:
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 riga che crea arg_list è un'espressione generatore che divide la stringa args su tutte le virgole e chiama .strip () per rimuovere eventuali spazi iniziali e finali.
Se, ad esempio, il terzo argomento è un int, basta fare:
arg_list[2] = int(arg_list[2])
O se tutti sono int:
arg_list = [int(arg) for arg in args.split(',')]
MODIFICA: ora per rispondere in modo specifico alla tua domanda utilizzando coppie chiave e valore come parametri, puoi utilizzare la stessa classe che Django usa per analizzare le stringhe di query dagli URL, che quindi ha anche il vantaggio di gestire correttamente la codifica dei caratteri in base alle tue impostazioni.py .
Quindi, come con le stringhe di query, ogni parametro è separato da "&":
{{ attr.name|replace:"cherche=_&remplacement= " }}
Quindi la tua funzione di sostituzione ora sarà simile a questa:
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
Potresti velocizzarne alcuni a rischio di fare alcune sostituzioni errate:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))