Jest to możliwe i dość proste.
Django dopuszcza tylko jeden argument do twojego filtra, ale nie ma powodu, dla którego nie możesz umieścić wszystkich argumentów w jednym łańcuchu, używając przecinka do ich oddzielenia.
Na przykład, jeśli chcesz filtr, który sprawdza, czy zmienna X znajduje się na liście [1,2,3,4], będziesz potrzebować filtru szablonu, który wygląda następująco:
{% if X|is_in:"1,2,3,4" %}
Teraz możemy stworzyć Twój szablon w następujący sposób:
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)
Linia, która tworzy arg_list, jest wyrażeniem generatora, które dzieli łańcuch args na wszystkie przecinki i wywołuje .strip () w celu usunięcia wszelkich spacji wiodących i końcowych.
Jeśli na przykład trzeci argument jest liczbą int, po prostu wykonaj:
arg_list[2] = int(arg_list[2])
Lub jeśli wszystkie z nich to int:
arg_list = [int(arg) for arg in args.split(',')]
EDYCJA: teraz, aby konkretnie odpowiedzieć na twoje pytanie, używając par klucz, wartość jako parametrów, możesz użyć tej samej klasy, której Django używa do parsowania ciągów zapytań z adresu URL, co z kolei ma również tę zaletę, że obsługuje kodowanie znaków zgodnie z twoimi ustawieniami. .
Tak więc, podobnie jak w przypadku ciągów zapytań, każdy parametr jest oddzielony znakiem „&”:
{{ attr.name|replace:"cherche=_&remplacement= " }}
Twoja funkcja zamiany będzie teraz wyglądać następująco:
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
Możesz to nieco przyspieszyć, ryzykując wykonanie nieprawidłowych wymian:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
tag
lubsimple_tag
- co pozwala na przekazywanie wielu zmiennych, nawet nazwanych.Niemożliwe zgodnie z tą sekcją dokumentów:
Filtry niestandardowe to po prostu funkcje Pythona, które pobierają jeden lub dwa argumenty:
źródło
To takie proste.
@register.filter(name='one_more') def one_more(_1, _2): return _1, _2 def your_filter(_1_2, _3) _1, _2 = _1_2 print "now you have three arguments, enjoy" {{ _1|one_more:_2|your_filter:_3 }}
źródło
Zamiast filtra zarejestruj swój tag jako prosty tag. Mogą przyjmować wiele argumentów. Składnia wywołania będzie trochę inna, ale to tylko zmiana cukru składniowego.
źródło
simple_tag
.To jest prostsze niż myślisz
Możesz do tego użyć simple_tag .
@register.simple_tag def multiple_args_tag(a, b, c, d): #do your stuff return
W szablonie :
{% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}
źródło
Ta funkcja została oznaczona jako WONTFIX w 2013 Django's Trac: http://code.djangoproject.com/ticket/1199
źródło
<moja-witryna> /globaltags/replace.py
from django.template import Library import re register = Library() def search(value, search): return re.sub(search, '#f4x@SgXXmS', value) def replace(value, replace): return re.sub('#f4x@SgXXmS', replace, value) register.filter(search) register.filter(replace)
W szablonie:
{{ "saniel"|search:"s"|replace:"d" }}
źródło
#f4x@SgXXmS
trochę wyjaśnił ?SUBSTRING_THAT_NEVER_OCCURS
myśl.Możesz po prostu zrobić to:
{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %} public static List<object> Find(object collection, string column, string value)
I dotrze do celu, tak jak abstrakcja funkcji
sjare
.źródło
Oto zły pomysł, ale działa:
{{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }}
i
@register.filter def input_by_xpath(device, args): args = eval(args) ... result = "<input type=\"%s\" value=\"%s\" name=\"%s\"/>"%(args['type'],value,args['xpath']) return mark_safe(result)
źródło