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',''))
tag
odersimple_tag
- verwendet, mit dem mehrere Variablen, sogar benannte Variablen, übergeben werden können.Gemäß diesem Abschnitt der Dokumentation nicht möglich :
Benutzerdefinierte Filter sind nur Python-Funktionen, die ein oder zwei Argumente annehmen:
quelle
So einfach ist das.
quelle
Registrieren Sie Ihr Tag anstelle eines Filters als einfaches Tag. Diese können mehrere Argumente annehmen. Die Syntax zum Aufrufen ist etwas anders, aber das ändert nur den syntaktischen Zucker.
quelle
simple_tag
.Diese Funktion wurde 2013 in Djangos Trac als WONTFIX markiert: http://code.djangoproject.com/ticket/1199
quelle
<my-site> /globaltags/replace.py
In der Vorlage:
quelle
#f4x@SgXXmS
etwas erklären würdest ?SUBSTRING_THAT_NEVER_OCCURS
Gedanken zu deklarieren .Es ist einfacher als Sie denken.
Sie können dafür simple_tag verwenden .
In Vorlage :
quelle
Sie können dies einfach tun:
Und es wird das Ziel erreichen, wie die Abstraktion der Funktion ist
sjare
.quelle
Hier ist eine schlechte Idee, aber funktioniert:
und
quelle