É possível e bastante simples.
Django permite apenas um argumento para o seu filtro, mas não há razão para você não colocar todos os seus argumentos em uma única string usando uma vírgula para separá-los.
Então, por exemplo, se você quiser um filtro que verifique se a variável X está na lista [1,2,3,4], você vai querer um filtro de modelo semelhante a este:
{% if X|is_in:"1,2,3,4" %}
Agora podemos criar sua templatetag assim:
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)
A linha que cria arg_list é uma expressão geradora que divide a string args em todas as vírgulas e chama .strip () para remover todos os espaços à esquerda e à direita.
Se, por exemplo, o terceiro argumento for um int, basta fazer:
arg_list[2] = int(arg_list[2])
Ou se todos eles forem ints, faça:
arg_list = [int(arg) for arg in args.split(',')]
EDITAR: agora, para responder especificamente à sua pergunta usando pares de chave e valor como parâmetros, você pode usar a mesma classe que o Django usa para analisar strings de consulta de URL, que também tem o benefício de lidar com a codificação de caracteres adequadamente de acordo com suas configurações.py .
Portanto, como acontece com as strings de consulta, cada parâmetro é separado por '&':
{{ attr.name|replace:"cherche=_&remplacement= " }}
Em seguida, sua função de substituição ficará assim:
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
Você pode acelerar um pouco com o risco de fazer algumas substituições incorretas:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))