Es ist möglich und ziemlich einfach.
Django lässt nur ein Argument für Ihren Filter zu, aber es gibt keinen Grund, warum Sie nicht alle Argumente mit einem Komma in eine einzelne Zeichenfolge einfügen können, um sie zu trennen.
Wenn Sie beispielsweise einen Filter wünschen, der prüft, ob die Variable X in der Liste [1,2,3,4] enthalten ist, benötigen Sie einen Vorlagenfilter, der folgendermaßen aussieht:
{% if X|is_in:"1,2,3,4" %}
Jetzt können wir Ihr Templatetag folgendermaßen erstellen:
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)
Die Zeile, die arg_list erstellt, ist ein Generatorausdruck, der die args-Zeichenfolge in alle Kommas aufteilt und .strip () aufruft, um führende und nachfolgende Leerzeichen zu entfernen.
Wenn zum Beispiel das dritte Argument ein int ist, dann tun Sie einfach:
arg_list[2] = int(arg_list[2])
Oder wenn alle von ihnen Ints sind:
arg_list = [int(arg) for arg in args.split(',')]
BEARBEITEN: Um Ihre Frage jetzt gezielt zu beantworten, indem Sie Schlüssel-Wert-Paare als Parameter verwenden, können Sie dieselbe Klasse verwenden, die Django verwendet, um Abfragezeichenfolgen aus URLs zu analysieren. Dies hat dann auch den Vorteil, dass die Zeichencodierung entsprechend Ihrer settings.py richtig gehandhabt wird .
Wie bei Abfragezeichenfolgen wird jeder Parameter durch '&' getrennt:
{{ attr.name|replace:"cherche=_&remplacement= " }}
Dann sieht Ihre Ersetzungsfunktion nun folgendermaßen aus:
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
Sie könnten dies beschleunigen, wenn das Risiko besteht, dass falsche Ersetzungen vorgenommen werden:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))